15 Stimmen

Wie erhalte ich die obersten 3 Elemente in einem int-Array unter Verwendung von LINQ?

Ich habe das folgende Array von Ganzzahlen:

int[] array = new int[7] { 1, 3, 5, 2, 8, 6, 4 };

Ich habe den folgenden Code geschrieben, um die Top-3-Elemente im Array zu erhalten:

var topThree = (from i in array orderby i descending select i).Take(3);

Wenn ich überprüfe, was sich im topThree befindet, finde ich:

{System.Linq.Enumerable.TakeIterator}
count:0

Was habe ich falsch gemacht und wie kann ich meinen Code korrigieren?

29voto

Jon Skeet Punkte 1325502

Wie haben Sie "überprüft, was sich in den topThree befindet"? Der einfachste Weg dies zu tun ist, sie auszudrucken:

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

Sieht für mich okay aus...

Es gibt potenziell effizientere Möglichkeiten, die top N-Werte zu finden als Sortieren, aber das wird sicherlich funktionieren. Sie könnten in Betracht ziehen, die Punktnotation für eine Abfrage zu verwenden, die nur eine Sache tut:

var topThree = array.OrderByDescending(i => i)
                    .Take(3);

14voto

Christian C. Salvadó Punkte 763569

Dein Code scheint für mich in Ordnung zu sein, möglicherweise möchtest du das Ergebnis in ein anderes Array zurückgeben?

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

4voto

jonot Punkte 73

Es liegt an der verzögerten Ausführung der Linq-Abfrage.

Wie vorgeschlagen, erhalten Sie das richtige Ergebnis, wenn Sie .ToArray() oder .ToList() oder ähnliches hinzufügen.

-2voto

Saon Mukherjee Punkte 71
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);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X