Как получить верхние 3 элемента в массиве int с помощью LINQ?

У меня есть следующий массив целых чисел:

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

Что я сделал неправильно и как я могу исправить свой код?

Ответ 1

Как вы "проверили, что внутри 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);

Ответ 2

Ваш код мне кажется хорошим, возможно, вы захотите вернуть результат в другой массив?

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

Ответ 3

Это связано с задержкой выполнения запроса linq.

Как было предложено, если вы добавите .ToArray() или .ToList() или подобное, вы получите правильный результат.

Ответ 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);