9

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

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

4

2 回答 2

18

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

Enumerable.OrderBy

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

于 2013-11-07T11:11:54.977 回答
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,那么答案是“不,你不能保证”。

如果您的序列是 a List<A>,则将保留排序(实际上,它将与 LINQ to Objects 一起保留,而不仅仅是列表)。

如果您的序列是IQueryable<A>,那么排序可能取决于 LINQ 提供程序实现、底层数据源和当前表达式树,已经包含在IQueryable<A>. 因此,在这种情况下,您应该强制使用OrderBy/进行排序OrderByDescending

于 2013-11-07T11:22:41.547 回答