IEnumerable ile birden fazla liste kavşağı.()Bilgisayar
Bunun gibi: kesişim bulmak istiyorum hangi listelerinin bir listesi var
var list1 = new List<int>() { 1, 2, 3 };
var list2 = new List<int>() { 2, 3, 4 };
var list3 = new List<int>() { 3, 4, 5 };
var listOfLists = new List<List<int>>() { list1, list2, list3 };
// expected intersection is List<int>() { 3 };
Bir şekilde IEnumerable ile bunu yapmak için var.() Bilgisayar mı?
EDİT:
Olmalıydım daha açık: gerçekten bir listesi listeleri, bilmem kaç olacak, üç listeleri yukarıdaki sadece bir örnek, ne var gerçekte IEnumerable<IEnumerable<SomeClass>>
ÇÖZÜM
Tüm büyük cevaplar için teşekkürler. Bunu çözmek için dört seçenek ortaya çıktı:Liste toplama(@Marcel Gosselin),Liste dosyalarda grup(@JaredPar, @Gabe Moothart),HashSet toplama(@jesperll)HashSet dosyalarda grup(@Tony Pony). Bazı performans Bu çözümleri test yaptım (değişensayı listesi,eleman sayısıher listesinderasgele sayı maxboyutu.
Çoğu durum için HashSet Liste daha iyi (büyük listeleri ve küçük rastgele sayı büyüklüğü nedeniyle HashSet yapısı hariç sanırım.)gerçekleştirir çıkıyor Dosyalarda grup yöntemi ve toplama yöntemi (yöntem gerçekleştiren dosyalarda grup arasında herhangi bir fark bulamadım ^em>birazdaha iyi.)
Bana toplama yöntemi gerçekten çekici (ve kabul cevap olarak gidiyorum) ama Teşekkürler.. en okunabilir, çözümün yine söylemezdim!
CEVAP
Nitekim Intersect
iki kez kullanabilirsiniz. Ancak, bu daha verimli olacağına inanıyorum:
HashSet<int> hashSet = new HashSet<int>(list1);
hashSet.IntersectWith(list2);
hashSet.IntersectWith(list3);
List<int> intersection = hashSet.ToList();
Elbette küçük ayarlar ile bir sorunu yok, ama eğer büyük bir sürü set varsa önemli olabilir.
Temelde Enumerable.Intersect
Her arama bir set - eğer daha fazla işlem yapmaya olacaksın, etrafında yer de kalabilirsin oluşturmak gerekir.
Her zamanki gibi, performans vs yakından takip okunabilirlik - iki kez yöntemi Intersect
arama zincirleme çok çekici.
EDİT: güncel soru İçin:
public List<T> IntersectAll<T>(IEnumerable<IEnumerable<T>> lists)
{
HashSet<T> hashSet = null;
foreach (var list in lists)
{
if (hashSet == null)
{
hashSet = new HashSet<T>(list);
}
else
{
hashSet.IntersectWith(list);
}
}
return hashSet == null ? new List<T>() : hashSet.ToList();
}
Ya da boş olmayacak, ve Atlamak nispeten ucuz olacak.
public List<T> IntersectAll<T>(IEnumerable<IEnumerable<T>> lists)
{
HashSet<T> hashSet = new HashSet<T>(lists.First());
foreach (var list in lists.Skip(1))
{
hashSet.IntersectWith(list);
}
return hashSet.ToList();
}
MVC3 kullanarak Varlık Çerçevesi için ...
Android: birden fazla tıklanabilir düğ...
# - C bir liste içinde Birden fazla ge...
Liste<T> dosyalarda grup olarak ...
Nasıl birden fazla tür parametreleri i...