Mevcut bir bilgisayara ikinci bir ICollection öğesinin farklı öğeleri eklemek için performans yolu arıyorum. Ben bu yapmalıyım .NET 4.C# 2 koleksiyonun farklı ürünlerini birleştirme
cevap
kullanıyorum:
var union = firstCollection.Union(secondCollection);
Bu:
list1.Union(list2).Distinct(aCustomComparer).ToList()
Yeter ki IEnumerable konum olarak alacak-to Linq cevap kullanabilirsiniz Çoğu nesne için referans eşitliği olan varsayılan eşitlik karşılaştırmasını kullanır. Bunu değiştirmek için, daha çok anlamsal bir karşılaştırma yapacak ve bunu Birliğin ikinci argümanı olarak belirleyecek olan koleksiyonunuzdaki öğe türüne bir IEqualityComparer jenerik tanımlayabilirsiniz.
bir başka yolu olacağını sizin Mevcut bir listenize eklemek için:
list1.AddRange(list2.Distinct().Except(list1));
Temel olarak bu, Union(), BTW'nin arkasındaki işlemdir. Except() yineleyicisi, geçirilen listeye temelde Any (x => x == Current) öğesini çağırır ve item2'den false olduğu öğeleri döndürür. – KeithS
Birlik hariç, orijinal listeyi değiştirmeyen OP, 'varolan bir tanesine ikinci bir İcolasyon'un farklı öğelerini ekleme' talebinde bulundu, Union yeni bir koleksiyon döndürdü. –
Cevabım, OP'nin istediği gibi olmayabilir, ama onun sorusu yeterince belirsiz. –
Sorunuzun en direkt cevap - Eğer giriş ya da ihtiyaç olarak sahip ICollection gerçek türlerinde çok ayrıntı vermediler beri çıktı Keiths
var union = firstCollection.Union(secondCollection);
tarafından verilen biri olarak bu ayrı bir IEnumerable dönecektir - yani bunu çok hızlı sonra ne gerek olup olmadığını. Basit bir karma yöntemini tekilleştirme yöntemine karşı birleştirme yöntemini (MethodA) çalıştıran ve bir Hashset <> (YöntemB) döndüren küçük bir test uygulaması (aşağıda) yaptım. Böyle List <> olarak koleksiyonun diğer türde bazı o IEnumerable dönüştürmek zorunda (gibi -
Ancak 2827ms:
Yöntemia: 1 ms
MethodB birliği yöntemi HashSet YOK EDER versiyon Adas yayınlanmıştır) değiştirir her şeyi:
Basitçe Yöntemia
için .ToList() ekleyerek0 o Çalıştığınız belirli dosyayla ilgili bilinmesi gerekir fazla görünüyor - -var union = firstCollection.Union(secondCollection).ToList();
Yani 2803ms ve herhangi:
Yöntemia: 3656ms
MethodB
sonuçlarını değiştirir Bulunduğunuz çözüm test edilmelidir - küçük (kod) bir değişikliğin BÜYÜK etkileri olabilir. Ben test etmek için aptal yoludur eminim - - Aşağıda
Ben bu yöntemleri karşılaştırmak için kullanılan bir testtir değil mi ama çalışmak :)private static void Main(string[] args) { ICollection<string> collectionA = new List<string>(); ICollection<string> collectionB = new List<string>(); for (int i = 0; i < 1000; i++) { string randomString = Path.GetRandomFileName(); collectionA.Add(randomString); collectionA.Add(randomString); collectionB.Add(randomString); collectionB.Add(randomString); } Stopwatch testA = new Stopwatch(); testA.Start(); MethodA(collectionA, collectionB); testA.Stop(); Stopwatch testB = new Stopwatch(); testB.Start(); MethodB(collectionA, collectionB); testB.Stop(); Console.WriteLine("MethodA: {0}ms", testA.ElapsedMilliseconds); Console.WriteLine("MethodB: {0}ms", testB.ElapsedMilliseconds); Console.ReadLine(); } private static void MethodA(ICollection<string> collectionA, ICollection<string> collectionB) { for (int i = 0; i < 10000; i++) { var result = collectionA.Union(collectionB); } } private static void MethodB(ICollection<string> collectionA, ICollection<string> collectionB) { for (int i = 0; i < 10000; i++) { var result = new HashSet<string>(collectionA); foreach (string s in collectionB) { result.Add(s); } } }
Sadece açık olmak gerekirse; Linq'den daha performanslı bir çözüm var. Bununla birlikte, .NET'te programladığınız programın% 99,9'u (sudan herhangi bir .NET uygulamasına neden olacak daha anadili bir dilin aksine) Linq performansa ve genellikle daha okunaklı ve anlaşılabilir bir uygulamaya sahiptir. . – KeithS
MethodA'nın çok daha hızlı olmasının sebebi, topladığı koleksiyonun elemanlarını saymadığı için, bu nedenle ToList'i çağırmanın bu kadar yavaş olmasının sebebi de budur. –
- 1. java interscect, birleştirme, birleştirme, farklı listelenmiş listeler
- 2. C# dizilerinde birleştirme/birleştirme #
- 3. wso2 ürünlerini nasıl birleştirirsiniz?
- 4. Birleştirme 2 GIT Şubeleri
- 5. Farklı dizinlerdeki veri çerçevelerini birleştirme
- 6. C# Yansıma - Koleksiyonun Genel Türünü Bulma
- 7. C++ b-ağacı birleştirme
- 8. unix: 2. sütunları kullanarak 2 dosya birleştirme
- 9. C#: Vektörlerle birleştirme sıralama
- 10. SQL birleştirme ve sol dış birleştirme: sonuçlar neden farklı?
- 11. Koleksiyonun bir alt kümesini bir C# yöntemine nasıl geçirebilirim? C++
- 12. birleştirme/birleştirme zaman dizileri (R)
- 13. Gözlemlenebilir koleksiyonun XAML
- 14. C# İki SortedLists (Birleştirme?)
- 15. 2 farklı veritabanından 2 farklı tablo sütunu karşılaştırın
- 16. i farklı uzunluktaki 2 diziler birleştirmek istiyoruz alternatif Değerleri
- 17. LINQ Koleksiyonun İçinde
- 18. Sayfa ürünlerini göster django pagination içinde gösterme
- 19. 2 Kontrolör için 2 farklı MessageConverters Yapılandırma
- 20. Java birine farklı tip haritalar Birleştirme 8
- 21. Doctrine 2 Birden çok birleştirme ile ManyToOneColumns
- 22. undefined method 2 için "birleştirme": Fixnum
- 23. Makrolar içinde makroları birleştirme - C++
- 24. c dize ve int birleştirme
- 25. MVC 2 RC 2, C#
- 26. SQL seçin Farklı Üst 2
- 27. Yakutta 2 farklı diziyi birleştir
- 28. MySQL - 2 farklı veritabanındaki tablolar arasında birleştirilsin mi?
- 29. Koleksiyonun java'da iki alanla eşleştirilmesi
- 30. alternatif birleştirme bağlantılı liste (c kodu)
görünüyor o Farklı kullanmak gereksiz() Union'dan sonra()? – 0xbadf00d
Birliğin koşullarına göre değişir. Varsayılan olarak, Union() yöntemi yalnızca aynı referansta bulunan nesneleri çıkarır. Distinct özel bir IEqualityComparer kullandığı için, aslında sendikadan daha fazlasını yapacak.ANCAK, IEqualityComparer'ın aynı zamanda doğrudan birleşik olarak kullanımı için de verilebilir, bu yüzden biraz fazlalık olan – KeithS
'Union', türüne bağlı olarak, bir karşılaştırma karşılaştırıcısı olabilir veya olmayabilir, varsayılan eşitlik karşılaştırıcısı kullanır. Https://msdn.microsoft.com/en-us/library/vstudio/bb341731(v=vs.100).aspx ve https://msdn.microsoft.com/en-us/library/vstudio/bb341731 adresine bakın. v = vs.100) .aspx. Dahası, bahsettiğiniz gibi, özel karşılaştırmayı “Birlik” yöntemine sunmak ve okunabilirlik için “Farklı” çağrıyı ve (belki?) Hafif bir performans artışı elde etmek daha iyidir. –