.NET List <T> Concat vs AddRange

Antworten:

120

Sie haben eine völlig andere Semantik.

AddRange ändert die Liste, indem die anderen Elemente hinzugefügt werden.

Concat gibt eine neue Sequenz zurück, die die Liste und die anderen Elemente enthält, ohne die Liste zu ändern.

Wählen Sie die Semantik aus, die Sie möchten.

Greg Beech
quelle
1
Wenn Sie also eine enge Schleife haben, ist es viel besser, die Reichweite zu verwenden, um die Leistung nicht durch all die internen Neuerungen und das Stampfen des GC zu verlieren.
Johnc
42
Aufgrund der verzögerten Ausführung wäre die Verwendung von Concat wahrscheinlich schneller, da die Objektzuweisung vermieden wird. Concat kopiert nichts, sondern erstellt lediglich Verknüpfungen zwischen den Listen. Wenn Sie also auflisten und das Ende einer Liste erreichen, gelangen Sie transparent zum Start vom nächsten!
Greg Beech
36

Der große Unterschied besteht darin, dass AddRange die Liste mutiert, für die es aufgerufen wird, während Concat eine neue Liste erstellt. Daher haben sie unterschiedliche Verwendungszwecke.

Concat ist auch eine Erweiterungsmethode, die für jede IEnumerable gilt und eine IEnumerable zurückgibt. Sie benötigen eine .ToList (), um eine neue Liste zu erstellen.

Wenn Sie den Inhalt einer vorhandenen Liste erweitern möchten, verwenden Sie AddRange.

Wenn Sie eine neue Liste aus zwei IEnumerable-Quellen erstellen, verwenden Sie Concat mit .ToList. Dies hat die Qualität, dass es keine der Quellen mutiert.

Wenn Sie immer nur den Inhalt von zwei Listen (oder einer anderen IEnumerable) auflisten müssen, verwenden Sie einfach jedes Mal Concat. Dies hat den Vorteil, dass kein neuer Speicher für die einheitliche Liste zugewiesen wird.

AnthonyWJones
quelle
3
+1, In der Tat, wenn Sie vergessen, "tolist", macht concat still nichts
grinsender
7

Ich fand diesen interessanten Artikel über den Unterschied zwischen diesen beiden Strukturen und den Vergleich ihrer Leistung ...

Die Hauptidee ist, dass AddRange viel schneller ist, wenn es um große Sammlungen geht.

Hier ist der Link

Hoffe das hilft,

Haithem KAROUI
quelle
1
Ich habe einen Test gemacht zu vergleichen Concatund AddRangemit einem List<KeyValuePair<string, string>>mit 1000 Elementen, verkettete / hinzugefügt 100 mal und AddRangewar extrem schneller. Die Ergebnisse waren folgende: AddRange13 ms, Concat().ToList()16.000 ms und Concatbei einem IEnumerableTun nur das ToListam Ende: 2.700 ms.
Andrew