假设我在循环中填充var lst = List<Foobar>
。我无法修改Foobar
对象。
在OrderBy
中对一个属性有效执行IEnumerable
的最佳方法是什么,但如果它们相等则保留原始顺序?例如,如果我有这个:
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},
}
答案 0 :(得分:7)
OrderBy
的实现已经是一种稳定的排序,也就是说它会在对象相等的情况下保持原始排序。
答案 1 :(得分:1)
假设 OrderBy
不是一个稳定的排序,这是我可以想到用一个LINQ语句来做的一种方式:
list.Select((element, index) => new { Element = element,
Index = index})
.OrderBy(a => a.Element.Foo)
.ThenBy(a => a.Index)
.Select(a => a.Element);