我需要修改一个集合,以便可以对其中的项目进行排序。
所以我正在做如下操作:
IEnumerable<ItemType> ordered = myItems.OrderBy( (item) => item.Age);
然而,我想修改
myItems
集合本身以获得有序序列...这是可能的吗?我想要的是这样的内容:
myItems.SomeActionHere // This should modify myItems in place.
这可能是一个新手问题。抱歉。
如果它是一个数组,你可以使用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<T>
即使它们不可修改。
另外,也有一种方法可以将其反转:Array.AsReadOnly。
myItems = Array.AsReadOnly(myItems.OrderBy(i => i.Age).ToArray());
除了代码更短之外,我没有看到太多好处——除非减少尖括号对你很重要 :)
如果不专门为您的序列类型实现OrderBy
,则无法使用Linq对您的集合进行排序。
OrderBy
(像大多数其他Linq运算符一样)是惰性的;它不会实现其结果,而只是每次重新读取源集合。因此,如果您更改了myItems
的内容,则每次枚举ordered
时,您都将在myItems
中看到最新的更改。
myItems = myItems.OrderBy(i => i.Age)
的意思是将myItems
中的元素按照它们的Age
属性升序排列。 - MarcinJuraszek