在linq中使用OrderBy()?

时间:2012-06-13 13:22:56

标签: c# linq

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

所以我做的事情是:

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

但是,我想修改myItems集合本身以获得有序序列......是否可能?

我想要类似的东西:

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

这可能是一个新手或noob问题。对不起。

4 个答案:

答案 0 :(得分:11)

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

但是,同样地,如果重复引用不是问题(通常不是),您只需将.ToArray().ToList()标记到linq语句的末尾即可“实现”有序可枚举项

例如:

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

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

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

请注意.ToArray()有效,因为数组实现IList<T>,即使它们不可修改。

或者 - 也有Array.AsReadOnly - 将其打开:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

OrderBy(和大多数其他Linq运营商一样) lazy ;它没有实现其结果,它只是每次都重新读取源集合。因此,如果您更改myItems的内容,则每次枚举ordered时,您都会看到myItems中的最新更改。

答案 3 :(得分:0)

使用SortedList或转换为SortedList