C# 如何使用LINQ获取int数组中的前3个元素?

C# 如何使用LINQ获取int数组中的前3个元素?,c#,linq,.net-3.5,C#,Linq,.net 3.5,我有以下整数数组: 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); 当我检查前三名中的内容时,我发现: {System.Linq.Enumerable.TakeIterator} 计数:0 我做错了什么?如何更正代码?您如何“检查前三名中的内容”?最简单的

我有以下整数数组:

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);
当我检查前三名中的内容时,我发现:

{System.Linq.Enumerable.TakeIterator}
计数:0

我做错了什么?如何更正代码?

您如何“检查前三名中的内容”?最简单的方法是将它们打印出来:

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);

我觉得你的代码很好,你可能想把结果返回到另一个数组

int[] topThree = array.OrderByDescending(i=> i)
                      .Take(3)
                      .ToArray();

这是由于延迟执行linq查询造成的

正如建议的那样,如果添加.ToArray()或.ToList()或类似内容,您将得到正确的结果。

int[]intArray=new int[7]{1,3,5,2,8,6,4};
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);
int ind=0; var listTop3=intArray.OrderByDescending(a=>a).Select(itm=>new{ 计数=++ind,值=itm })其中(itm=>itm.count<4);
我在QuickWatch中查看了它。感谢您让事情变得更清楚。QuickWatch可能是保守的做法,除非您真的要求,否则它不会为您执行代码。查询实际上没有数据——它只知道如何获取数据。获取数据可能很慢,或者可能有副作用,因此默认情况下在调试器中显示数据是个坏主意。“有可能比排序更有效的方法来查找前N个值”-您能提供一个更有效的方法的示例吗?@TotZam:如果您随时记得当前的“前3个”,您只需在结果上迭代一次,根据需要将元素划分到这三个位置。但这将是非常微妙的。我的Edulinq实现也会比LinqTo对象更有效,因为它只会延迟排序。(它使用快速排序,但在对第一个块进行排序时开始返回项,就像它原来一样。)前三位中的对象不是结果,而是查询。topThree是一个对象,意思是“将数组中的项目顺序从最高到最低排序,并取前三个”。这就是它的全部意思。它不是指“8,6,5”。它指的是查询,而不是结果。您可以通过执行查询,然后更改数组,然后再次执行查询来演示这一点。查询完全相同,但结果不同。