在OrderBy中维护子序列顺序

时间:2013-11-07 11:08:19

标签: c# sorting ienumerable

假设我有一个具有整数Day属性的类和一个IEnumerable<T>个对象,其中的天数分别为2,3,4,1,3,3和5(按此顺序)。 / p>

有没有办法保证子序列的顺序(例如)o.Day == 3从其元素在原始列表中的相对位置得到维护而不需要需要显式的,自定义的IEnumerable的实施?

2 个答案:

答案 0 :(得分:12)

OrderBy被记录为stable,如果这是你的意思;所以:你不应该做任何事情。

Enumerable.OrderBy

  

此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定的排序不会保留具有相同键的元素的顺序。

答案 1 :(得分:1)

  

有没有办法保证子序列的顺序

假设你有这样的课程:

class A
{
    public string Name { get; set; }
    public int Day { get; set; }

    // other properties
}

和序列:

{ "A", 2 },
{ "B", 3 },
{ "C", 4 },
{ "D", 1 },
{ "E", 3 },
{ "F", 3 },
{ "G", 5 },

如果你的意思是,请这样:

sequence.Where(item => item.Day == 3)

生成序列,其中的项目将按如下顺序排序:B, E, F,然后答案是“不,你不能保证”。

如果您的序列是List<A>,那么将保留排序(实际上,它将通过LINQ to Objects保留,而不仅仅是列表)。

如果序列为IQueryable<A>,则排序可能取决于IQueryable<A>中已包含的LINQ提供程序实现,基础数据源和当前表达式树。因此,在这种情况下,您应该强制使用OrderBy / OrderByDescending订购。