我有以下整数数组:
int[] array = new int[7] { 1, 3, 5, 2, 8, 6, 4 };
我编写了以下代码来获取数组中的前3个元素:
var topThree = (from i in array orderby i descending select i).Take(3);
当我检查topThree
中的内容时,我发现:
{System.Linq.Enumerable.TakeIterator}
数:0
我做错了什么以及如何更正我的代码?
答案 0 :(得分:26)
你是如何“检查topThree里面的内容”的?最简单的方法是打印出来:
using System;
using System.Linq;
public class Test
{
static void Main()
{
int[] array = new int[7] { 1, 3, 5, 2, 8, 6, 4 };
var topThree = (from i in array
orderby i descending
select i).Take(3);
foreach (var x in topThree)
{
Console.WriteLine(x);
}
}
}
对我来说没问题......
找到前N个值的方法可能比排序更有效,但这肯定有效。您可能需要考虑对只执行一项操作的查询使用点表示法:
var topThree = array.OrderByDescending(i => i)
.Take(3);
答案 1 :(得分:13)
您的代码对我来说似乎很好,您可能希望将结果返回到另一个数组?
int[] topThree = array.OrderByDescending(i=> i)
.Take(3)
.ToArray();
答案 2 :(得分:4)
由于linq查询的执行延迟。
如果你添加.ToArray()或.ToList()或类似内容,你会得到正确的结果。
答案 3 :(得分:-2)
int[] intArray = new int[7] { 1, 3, 5, 2, 8, 6, 4 };
int ind=0;
var listTop3 = intArray.OrderByDescending(a=>a).Select(itm => new {
count = ++ind, value = itm
}).Where(itm => itm.count < 4);