【问题标题】:Using OrderBy() in linq?在 linq 中使用 OrderBy()?
【发布时间】:2012-06-13 13:22:55
【问题描述】:

我需要修改一个集合,以便对其中的项目序列进行排序。

所以我正在做类似的事情:

IEnumerable<ItemType> ordered = myItems.OrderBy( (item) => item.Age);

但是,我想修改 myItems 集合本身以使其具有有序序列...可以吗?

我想要类似的东西:

myItems.SomeActionHere // This should modify myItems in place.

这可能是一个新手或菜鸟问题。对此感到抱歉。

【问题讨论】:

  • myItems = myItems.OrderBy(i =&gt; i.Age)?
  • myItems 的类型为 ReadOnlyCollection

标签: c# linq


【解决方案1】:

如果是数组,您可以使用Array.Sort。这会在不重复引用/值的情况下执行就地排序。

同样,如果重复引用不是问题(通常不是问题),您可以在 linq 语句的末尾标记 .ToArray().ToList() 以“实现”有序枚举。

例如:

myItems = myItems.OrderBy(i => i.Age).ToArray();

如果你绝对需要它作为另一个 ReadOnlyCollection 实例 - 你可以这样做:

myItems = new ReadOnlyCollection<ItemType>(myItems.OrderBy(i => i.Age).ToArray());

请注意,.ToArray() 有效,因为数组实现了IList&lt;T&gt;,即使它们不可修改。

或者 - 还有Array.AsReadOnly - 把它打开:

myItems = Array.AsReadOnly(myItems.OrderBy(i => i.Age).ToArray());

除了是较短的代码行之外,我没有看到太多好处 - 除非减少尖括号对您很重要 :)

【讨论】:

  • @Andras...那就更好了。总是欢迎在我的代码中使用较短的代码行。我什至不知道有一个 Array.AsReadOnly()。我不知道你们是怎么看这些东西的……
  • 缩小角括号?这是什么意思?
【解决方案2】:

您将无法使用 Linq 来订购我放置的收藏。除非你专门去为你的序列类型实现OrderBy

【讨论】:

    【解决方案3】:

    OrderBy(与大多数其他 Linq 运算符一样)是 惰性的;它没有实现它的结果,它只是每次都重新读取源集合。所以如果你改变myItems的内容,每次你枚举ordered你都会看到myItems的最新变化。

    【讨论】:

      【解决方案4】:

      使用SortedList 或转换为SortedList

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多