Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linq OrderBy int property does not work [closed]

Tags:

c#

.net

linq

I have an IEnumerable of custom objects - allBanners, one of the property is called Order and is of type int. My usage is like below:

var bannersVisibleToEveryone = allBanners
                                .Where(b => b.UserSegments.Contains("Everyone"))
                                .OrderBy(b => b.Order)
                                .Take(moreBanners)
                                .ToList();

When I inspect the bannersVisibleToEveryone after the above line - the list is not sorted at all - it is randomly sorted as the allBanners is. Why is that?

Screenshot of the debug below

EDIT: on the screenshot it looks like it is ordered descending (which is wrong too, because I am using orderBy, not orderByDescending), but the fourth element's Order is 350, so it is not ordered descending, sorry for the misleading screenshot.

EDIT 2: Complete method definition:

public static List<T> GetBannersForCurrentUser<T>(IEnumerable<T> allBanners,
                                                IEnumerable<string> userSegments,
                                                int maxNumberOfBanners)
where T : ICitilinkItem
{
var filteredBanners = allBanners
                                .Where(b => userSegments.Any(us => b.UserSegments.Contains(us)))
                                .OrderBy(b => b.Order)
                                .Take(maxNumberOfBanners)
                                .ToList();

int moreBanners = maxNumberOfBanners - filteredBanners.Count;
if (moreBanners > 0 && !userSegments.Contains("Everyone"))
{
    //add the banners from Everyone
    var bannersVisibleToEveryone = allBanners
                                        .Where(b => b.UserSegments.Contains("Everyone"))
                                        .OrderBy(b => b.Order)
                                        .Take(moreBanners)
                                        .OrderBy(b => b.Order)
                                        .ToList();

    filteredBanners.AddRange(bannersVisibleToEveryone);
}
return filteredBanners;
}

And the getter of the Order property:

public interface ICitilinkItem
{
string Title { get; set; }

string UserSegments { get; set; }

int Order { get; set; }
}

public class CitilinkModelBase : ICitilinkItem
{
public string Title { get; set; }

public string UserSegments { get; set; }

public int Order { get; set; }

public CitilinkModelBase()
{

}
}
like image 737
Veselin Vasilev Avatar asked Jan 22 '26 15:01

Veselin Vasilev


1 Answers

Mystery solved - I had a class HomePageBanner which was inheriting the CitilinkModelBase base class AND also defines an Order property which was hiding the underlying one. Thanks @odyss-jii for pointing me in the right direction.

like image 99
Veselin Vasilev Avatar answered Jan 24 '26 06:01

Veselin Vasilev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!