【问题标题】:Linq order by property, then by original orderLinq 按属性排序,然后按原始顺序
【发布时间】:2014-09-17 18:41:02
【问题描述】:

假设我在循环中填充了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 =&gt; x.Foo).ToList 之后得到以下信息:

List<Foobar> {
new Foobar{Foo = "a", Bar=2}
new Foobar{Foo = "b", Bar=3},
new Foobar{Foo = "b", Bar=1},
}

【问题讨论】:

  • 发个例子怎么样?
  • 现在,您为什么不尝试一下简单的OrderBy?它将返回您期望的结果。

标签: c# linq ienumerable


【解决方案1】:

OrderBy的实现已经是一个稳定的排序,也就是说在对象相等的情况下会保持原来的排序。

【讨论】:

    【解决方案2】:

    假设 OrderBy 不是一个稳定的排序,这是我能想到的使用单个 LINQ 语句的一种方法:

    list.Select((element, index) => new { Element = element,
                                          Index = index})
        .OrderBy(a => a.Element.Foo)
        .ThenBy(a => a.Index)
        .Select(a => a.Element);
    

    【讨论】:

    • Assuming OrderBy was not a stable sort,不要做出错误的假设。
    • @L.B 谢谢显而易见的船长,你一定很擅长聚会。
    • @test 我必须承认,你擅长解决不存在的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多