2010-12-20 12 views
10

Nach etwas mehr als einer Stunde verbrachte einen Fehler in unserem Code debuggen, die am Ende etwas über die Enumerable.Except Methode erwiesen, die wir nicht wussten über:Warum gibt Enumerable.Except DISTINCT-Elemente zurück?

var ilist = new[] { 1, 1, 1, 1 }; 
var ilist2 = Enumerable.Empty<int>(); 
ilist.Except(ilist2); // returns { 1 } as opposed to { 1, 1, 1, 1 } 

oder allgemeiner:

var ilist3 = new[] { 1 }; 
var ilist4 = new[] { 1, 1, 2, 2, 3 }; 
ilist4.Except(ilist3); // returns { 2, 3 } as opposed to { 2, 2, 3 } 

mit Blick auf der MSDN-Seite:

Diese Methode liefert die Elemente in ersten, die in der zweiten nicht erscheinen. Es nicht auch die Elemente in Sekunde, die nicht in der ersten erscheinen.

ich es, dass in Fällen wie folgt aus:

var ilist = new[] { 1, 1, 1, 1 }; 
var ilist2 = new[] { 1 }; 
ilist.Except(ilist2); // returns an empty array 

Sie das leere Array erhalten, weil jedes Element in der ersten Reihe ‚erscheint‘ in der zweiten und daher entfernt werden sollte.

Aber warum erhalten wir nur bestimmte Instanzen aller anderen Elemente, die nicht im zweiten Array erscheinen? Was ist der Grund für dieses Verhalten?

+0

Meiner Meinung nach, riecht wie ein Fehler oder unbeabsichtigte Funktionalität. Die MSDN-Seite sagt nicht über ein eindeutiges Ergebnis aus ... –

+7

Dies ist kein Fehler. Die Methode "Except" soll in den SQL-Operator "EXCEPT" übersetzt werden, der als eine Mengenoperation definiert ist. Da es sich um eine Mengenoperation handelt, werden nur bestimmte Elemente zurückgegeben. Die "Unterscheidbarkeit" wird durch die Verwendung der Terminologie "set" von MSDN impliziert. – Gabe

Antwort

16

Ich kann sicherlich nicht mit Sicherheit sagen, warum sie sich dafür entschieden haben. Aber ich werde es versuchen.

MSDN beschreibt Außer wie folgt aus:

Erzeugt die Satz Differenz zweier Sequenzen durch die Standard Gleichheitsvergleichs zum Vergleichen von Werten.

A Set wie folgt beschrieben:

Ein Set ist eine Sammlung von verschiedene Objekte ist, als ein Objekt betrachtet in seinem eigenen Recht

+1

+1, das klingt vernünftig. – driis

+2

+1 Die Implementierung verwendet Hashsets, um das Problem von O (NxN) nach O (N) zu reduzieren. – dthorpe

Verwandte Themen