在 LINQ 中如何使用 OrderBy()?

3

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

所以我正在做如下操作:

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

然而,我想修改myItems集合本身以获得有序序列...这是可能的吗?
我想要的是这样的内容:
myItems.SomeActionHere // This should modify myItems in place.

这可能是一个新手问题。抱歉。

3
myItems = myItems.OrderBy(i => i.Age) 的意思是将 myItems 中的元素按照它们的 Age 属性升序排列。 - MarcinJuraszek
myItems 是 ReadOnlyCollection<ItemType> 类型。 - user1202434
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());

除了代码更短之外,我没有看到太多好处——除非减少尖括号对你很重要 :)


@Andras...这样更好。在我的代码中,更短的代码行总是受欢迎的。我甚至不知道有一个Array.AsReadOnly()方法。我不知道你们是如何查找这些东西的... - user1202434
减少尖括号?这是什么意思? - Eric Bishard

2

如果不专门为您的序列类型实现OrderBy,则无法使用Linq对您的集合进行排序。


0

OrderBy(像大多数其他Linq运算符一样)是惰性的;它不会实现其结果,而只是每次重新读取源集合。因此,如果您更改了myItems的内容,则每次枚举ordered时,您都将在myItems中看到最新的更改。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接