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