SORU
4 Kasım 2009, ÇARŞAMBA


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
4 Kasım 2009, ÇARŞAMBA


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();
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • andyabc45

    andyabc45

    1 Mayıs 2011
  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • Tomas N

    Tomas N

    14 Kasım 2010