按属性排序,然后按原始顺序排序

本文关键字:排序 顺序 原始 属性 然后 | 更新日期: 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);