Linq按属性订购,然后按原始订单

时间:2014-09-17 18:41:02

标签: c# linq ienumerable

假设我在循环中填充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},
}

2 个答案:

答案 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);