假设我有一个具有整数Day
属性的类和一个IEnumerable<T>
个对象,其中的天数分别为2,3,4,1,3,3和5(按此顺序)。 / p>
有没有办法保证子序列的顺序(例如)o.Day == 3
从其元素在原始列表中的相对位置得到维护而不需要需要显式的,自定义的IEnumerable
的实施?
答案 0 :(得分:12)
OrderBy
被记录为stable,如果这是你的意思;所以:你不应该做任何事情。
此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定的排序不会保留具有相同键的元素的顺序。
答案 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
订购。