.NET Listesi <T> Concat ve AddRange


Yanıtlar:


126

Tamamen farklı anlamlara sahipler.

AddRange, listeye diğer öğeleri ekleyerek değiştirir.

Concat, listeyi değiştirmeden listeyi ve diğer öğeleri içeren yeni bir sıra döndürür.

Hangisinin istediğiniz semantiğe sahip olduğunu seçin.


1
Yani sıkı bir döngü yapın, tüm dahili yenileme ve GC'yi vurma nedeniyle performansı kaybetmemek için ek aralık kullanmak çok daha iyi olur mu?
johnc

46
Aslında, ertelenmiş yürütme nedeniyle, Concat kullanmak daha hızlı olacaktır çünkü nesne ayırmayı önler - Concat hiçbir şeyi kopyalamaz, sadece listeler arasında bağlantılar oluşturur, böylece numaralandırırken ve siz listenin sonuna ulaştığınızda sizi şeffaf bir şekilde başlangıca götürür. sonraki!
Greg Beech

38

En büyük fark, AddRange'ın çağrıldığı listeyi değiştirirken, Concat'ın yeni bir Liste oluşturmasıdır. Dolayısıyla farklı kullanımları var.

Ayrıca Concat, herhangi bir IEnumerable için geçerli olan ve yeni bir Liste oluşturmak için bir .ToList () 'e ihtiyacınız olan bir IEnumerable'ı döndüren bir genişletme yöntemidir.

Mevcut bir listenin içeriğini genişletmek istiyorsanız AddRange kullanın.

İki IEnumerable kaynağından yeni bir liste oluşturuyorsanız, Concat'ı .ToList ile kullanın. Bu, her iki kaynağı da değiştirmeyecek niteliktedir.

Yalnızca iki Listenin (veya başka bir IEnumerable) içeriğini numaralandırmanız gerekiyorsa, her seferinde Concat'ı kullanın, bu, birleştirilmiş listeyi tutmak için yeni bellek ayırmama avantajına sahiptir.


3
1, Gerçekten de, sen concat sessizce hiçbir şey yapmaz 'ToList' unutursanız
smirkingman

7

Bu 2 yapı arasındaki farkı anlatan ve performanslarını karşılaştıran bu ilginç makaleyi buldum ...

Ana fikir, AddRange'in büyük boyutlu koleksiyonlarla ilgili olduğunda çok daha hızlı olmasıdır.

İşte Bağlantı

Bu yardımcı olur umarım,


1
1000 öğe ile karşılaştırarak Concatve 100 kez birleştirilmiş / eklenmiş bir test yaptım ve çok daha hızlıydı. : Sonuçlar şunlardı 13 ms, 16.000 ms ve bir de sadece yapıyor sonunda: 2,700 ms. AddRangeList<KeyValuePair<string, string>>AddRangeAddRangeConcat().ToList()ConcatIEnumerableToList
Andrew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.