SORU
8 EYLÜL 2010, ÇARŞAMBA


İki Liste&; T> eşitlik için nesneleri lt, sipariş görmezden karşılaştırın

Başka bir liste-karşılaştırılması soru henüz.

List<MyType> list1;
List<MyType> list2;

Onlar aynı elemanları hem bu liste içindeki konumlarını dikkate almadan kontrol etmem gerekiyor. HerMyTypenesne listesinde birden çok kez görünebilir. Bu kontrol eden yerleşik bir işlevi var mı? Eğer her öğe yalnızca bir kez görünen listedeki garanti edersem ne olur?

DÜZENLEME:Arkadaşlar cevaplar için teşekkürler ama bir şey eklemeyi unuttum, her bir öğenin yinelenme iki listede de aynı olmalıdır.

CEVAP
8 EYLÜL 2010, ÇARŞAMBA


Eğer onları gerçekten eşit (aynı öğeler ve her öğe aynı sayıda yani) olmak istiyorsan, en basit çözüm karşılaştırarak önce sıralamak için olduğunu düşünüyorum

Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))

Düzenleme:

Burada biraz daha iyi (yaklaşık on kat daha hızlı) gerçekleştirir, ve sadece IEquatable, IComparable gerektiren bir çözüm:

public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2) {
  var cnt = new Dictionary<T, int>();
  foreach (T s in list1) {
    if (cnt.ContainsKey(s)) {
      cnt[s]  ;
    } else {
      cnt.Add(s, 1);
    }
  }
  foreach (T s in list2) {
    if (cnt.ContainsKey(s)) {
      cnt[s]--;
    } else {
      return false;
    }
  }
  return cnt.Values.All(c => c == 0);
}

Edit 2:

Herhangi bir veri türü anahtar (örneğin Frank Tzanabetis olarak null olabilecek tür işaret) işlemek için, sözlük için comparer götüren bir sürüm yapabilirsiniz:

public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer) {
  var cnt = new Dictionary<T, int>(comparer);
  ...

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Epic Tutorials for iPhone, iPad and iOS

    Epic Tutoria

    18 EYLÜL 2011
  • OnlyFunClips

    OnlyFunClips

    16 ŞUBAT 2012
  • PUSHER

    PUSHER

    11 HAZİRAN 2014