我需要修改一个集合,以便我可以对其中的项目序列进行排序。
所以我做的事情是:
IEnumerable<ItemType> ordered = myItems.OrderBy( (item) => item.Age);
但是,我想修改myItems
集合本身以获得有序序列......是否可能?
我想要类似的东西:
myItems.SomeActionHere // This should modify myItems in place.
这可能是一个新手或noob问题。对不起。
答案 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。