按属性排序,然后按原始顺序排序
本文关键字:排序 顺序 原始 属性 然后 | 更新日期: 2023-09-27 18:22:25
假设我在循环中填充了var lst = List<Foobar>
。我无法修改Foobar
对象。
对IEnumerable
中的一个属性有效地执行OrderBy
,但在它们相等的情况下保留原始顺序的最佳方法是什么?例如,如果我有这个:
var lst = new List<Foobar> {
new Foobar{Foo = "b", Bar=3},
new Foobar{Foo = "b", Bar=1},
new Foobar{Foo = "a", Bar=2}
}
我想确保在lst.OrderByWithPreserveOrder(x => x.Foo).ToList
之后我能得到以下内容:
List<Foobar> {
new Foobar{Foo = "a", Bar=2}
new Foobar{Foo = "b", Bar=3},
new Foobar{Foo = "b", Bar=1},
}
OrderBy
的实现已经是一个稳定的排序,也就是说,在对象相等的情况下,它将保持原始排序。
假设OrderBy
不是一个稳定的排序,我可以用一个LINQ语句来实现这一点:
list.Select((element, index) => new { Element = element,
Index = index})
.OrderBy(a => a.Element.Foo)
.ThenBy(a => a.Index)
.Select(a => a.Element);