3

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

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

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

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

我想要类似的东西:

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

这可能是一个新手或菜鸟的问题。对于那个很抱歉。

4

4 回答 4

11

如果它是一个数组,您可以使用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());

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

于 2012-06-13T13:25:24.493 回答
2

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

于 2012-06-13T13:25:15.647 回答
0

使用SortedList或转换为SortedList

于 2012-06-13T13:31:27.463 回答
0

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

于 2012-06-13T13:26:27.273 回答