2010-03-19 5 views
13

WouldHat Distinct() erhalten immer

int[] nums = { 2, 3, 3, 4, 2, 1, 6, 7, 10 }; 
var distinct = nums.Distinct(); 

immer das erste Element in der Liste nehmen 2, 3, 4, 1, 6, 7, 10 in dieser Reihenfolge zurückkehren?

Antwort

16

Das definierte Verhalten von Enumerable.Distinct ist, dass es eine ungeordnete Auflistung (Documentation) zurückgibt.

Die aktuelle Implementierung von Distinct in Linq zu Objects wird jedoch die Reihenfolge beibehalten. Dies ist jedoch nicht für andere LINQ-Anbieter garantiert und das Verhalten sollte nicht verlässlich sein.

+0

So wird manchmal manchmal ({3, 2, 4, 10, 6, 7, 1} ') anstatt in der Reihenfolge zurückgegeben, in der die Elemente angetroffen wurden? Haben Sie vielleicht Links für diesen oder einen Beispielcode? – Cornelius

+0

@Cornelius siehe meine aktualisierte Antwort – JaredPar

+0

Ähnliche Antwort für Queryable.Distinct (es gibt eine ungeordnete Sequenz) siehe [DISTINCT() und ORDERBY Problem] (// stackoverflow.com/a/12429107) –

0

Allgemein: nein, aber in Ihrem Fall (mit einem Array int): wahrscheinlich ja. Ich wette, dass sie nur die Sammlung aufzählen und Dinge ignorieren, auf die sie bereits gestoßen sind. Aber zählen Sie nicht auf dieses Verhalten in verschiedenen Versionen von .NET oder für verschiedene Arten von Sammlungen.

Wie JaredPar in seiner Antwort darauf hingewiesen, ist das Ergebnis als ungeordnet angegeben. Wenn Sie eine bestimmte Reihenfolge wünschen, müssen Sie sie danach sortieren, indem Sie den Algorithmus verwenden, der in Ihrem Fall sinnvoll ist.

2

Ich denke, das Wort "ungeordnet" bedeutet die gleiche Reihenfolge der ursprünglichen Sequenz.
Daher sollte der Aufrufer entscheiden, ob das Ergebnis sortiert werden soll oder nicht.

+3

Sie denken, das Wort "ungeordnet" bedeutet "in einer bestimmten Reihenfolge"? Das ist eine seltsame Sache zu denken! :-) "Ungeordnet" bedeutet "in keiner bestimmten Reihenfolge". –

+0

@Eric: Ich hoffe, Sie haben diesen Kommentar gelesen. Was ich meine, ist (und ich denke impliziert), die Reihenfolge der Rückgabewertsequenz wird nicht modifiziert (d. H. Die Reihenfolge der zurückgegebenen Sequenz wird beibehalten als die der übergebenen Sequenz). Wo habe ich gesagt "ungeordnet" bedeutet in einer bestimmten Reihenfolge? Daher wird, wie im obigen Fall 'int [] nums = {2, 3, 3, 4, 2, 1, 6, 7, 10}; ', die zurückgegebene Sequenz den Rückgabewert nicht sortieren und' 2, 3,4,1,6, 7, 10'. – shahkalpesh

+3

Und diese Reihenfolge - die Reihenfolge, in der die ursprüngliche Sequenz erscheint - ist eine bestimmte Reihenfolge, eine von Millionen von möglichen Ordnungen. Die Dokumentation der Methode garantiert nicht, dass diese bestimmte Reihenfolge gewählt wird. In * practice * wird diese spezifische Reihenfolge gewählt. Aber "ungeordnet" bedeutet die Dokumentation, dass * jede Bestellung * von der Implementierung ausgewählt werden kann. Manchmal ist es effizienter, die ursprüngliche Reihenfolge nicht beizubehalten. –