使用orderby对int数组进行排序
我想按升序排序我的int数组。
首先我复制一下我的数组:
int[] copyArray = myArray.ToArray();
然后我想按升序排序,如下所示:
int[] sortedCopy = from element in copyArray orderby element ascending select element;
但是我得到一个错误,“选中”得到了高位,错误是:“不能隐式地将类型’system.linq.iorderedenumerable’转换为’int []’”
您需要在最后调用ToArray()
以实际将有序序列转换为数组。 LINQ使用延迟评估 ,这意味着在调用ToArray()
, ToList()
或其他类似方法之前,不会执行中间处理(在本例中为排序)。
这样做已经复制了元素,因此您实际上不需要先创建自己的副本。
例:
int[] sortedCopy = (from element in myArray orderby element ascending select element) .ToArray();
在表达式语法中写这个可能更好:
int[] sortedCopy = myArray.OrderBy(i => i).ToArray();
注意:如果您不需要副本(即可以更改myArray
),那么更简单,更有效的方法就是:
Array.Sort(myArray);
这会对数组进行就地排序,利用它是一个尽可能高效的数组这一事实。
对于更复杂的场景(例如,成员级的对象arrays),您可以执行以下操作:
Array.Sort(entityArray, (x,y) => string.Compare(x.Name, y.Name));
这是道德等同于:
var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray();
但又一次:就地进行排序。
我们不知道你接下来在做什么,但也许你不需要一个数组。 如果它进入另一个linq语句或foreach,那么只需保持原样,最简单的方法就是使用var
。
var sortedCopy = myArray.OrderBy(i => i); foreach(var item in sortedCopy) { //print out for example }
这允许linq尽可能地懒惰。 如果你总是ToArray
或ToList
那么除了评估那里和那里之外别无选择,并为结果分配内存。