2009-08-26 8 views

Antwort

49

Union entfernt Duplikate. Concat nicht.

Sie produzieren also unterschiedliche Ergebnisse, wenn die Quellen entweder gemeinsame Elemente enthalten oder interne Duplikate enthalten.

Wenn Sie garantieren können, dass es keine Duplikate gibt, oder wenn es wenige gibt und Sie sich nicht darum kümmern, sie in Ihrer Ausgabe zu haben, wird Concat schneller sein, da es nicht nötig ist, jeden Wert mit dem bereits Ergebenen zu testen.

Wenn jedoch viele Duplikate vorhanden sind und Sie sie nicht benötigen, kann die zusätzliche Verarbeitung in Union zum Entfernen der Duplikate durch die Einsparungen in Ihrem Code ausgeglichen werden, die die Ergebnisse verbrauchen.

9

Ist Ihnen nur die Ausführungsgeschwindigkeit wichtig? Wie lange dauert es, ein Element zu verarbeiten, wenn Sie es erhalten?

Concat ist einfacher - es muss keine Verarbeitung selbst durchführen oder die Ergebnisse puffern, die es bereits zurückgegeben hat. Es wird jedoch mehr Ergebnisse erzeugen, wenn Elemente in der Kreuzung vorhanden sind. Wenn Sie lange brauchen, um jedes Ergebnis zu verarbeiten, kann Concateffektiv langsamer sein.

+0

In meinem Fall werde ich am Ende ein Distinct() verwenden, was die Verwendung von Union begünstigt, denke ich. –

+6

Wenn Sie Union verwenden, müssen Sie Distinct danach nicht mehr aufrufen. –

+2

Union entfernt Duplikate zwischen den Listen, aber wenn die erste Liste Duplikate in sich hat, werden diese nicht durch Union entfernt. Also - Distinct muss je nach den Umständen immer noch aufgerufen werden. –

3

Was oben gesagt wurde, ist richtig. Hier ist nur ein kleiner Zusatz für einige spezielle Fälle:

Wenn Sie zum Beispiel zwei Listen verketten haben und wenn Sie die volle Geschwindigkeit benötigen, sollten mit Ausbeute. Natürlich ist dies viel weniger flexibel und bequem als Union oder Concat in Linq. Daher ist es nur in besonderen Fällen sinnvoll.

Diese Eigenschaft wird zum Beispiel das gleiche wie List1.Concat (List2) bieten

public IEnumerable<MyObject> AllObjects 
    { 
     get 
     { 
      foreach (MyObject o1 in List1) 
       yield return o1; 

      foreach (MyObject o2 in List2) 
       yield return o2; 
     } 
    } 
+0

'Concat' genau so, wie Sie es im Beispiel zeigen (siehe: [source] (https://referencesource.microsoft.com/#System.Core/System/Linq/ Enumerable.cs # 800)). Sie müssen es also nicht selbst implementieren. – scher