Linq按int属性排序无效。

3

我有一个自定义对象的IEnumerable - allBanners,其中一个属性被称为Order类型为int。 我的用法如下:

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

当我在以上代码行之后检查bannersVisibleToEveryone时,列表没有排序,它的顺序与allBanners中的顺序是随机的。 为什么会这样?

Screenshot of the debug below

编辑: 在截图上看起来是按降序排序的(这也是错误的,因为我使用的是orderBy而不是orderByDescending),但第四个元素的Order是350,因此它并没有按降序排序,很抱歉这张截图引起了误导。

编辑2: 完整的方法定义:

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;
}

而 Order 属性的 getter:

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()
{

}
}

我看不到哪里是“随机”顺序。它从500到100! - Matías Fidemraizer
@User2012384 嗯,但这不是随机的,对吧。 - Matías Fidemraizer
7
请提供一个最小、完整且可验证的示例,展示您的代码? - Enigmativity
2
Order 的 getter 是什么样子的?allBanners 的类型是什么? - odyss-jii
以上代码已更新。是的,我尝试过删除Take和ToList - 仍然一样。 - Veselin Vasilev
显示剩余7条评论
1个回答

4
谜团揭开了——我有一个类HomePageBanner继承了CitilinkModelBase基类,并且定义了一个Order属性,这个属性隐藏了底层的属性。感谢@odyss-jii指点我正确的方向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接