2012-07-25 39 views
6

2 farklı türde sözlük var Dictionary<int, Fooclass> oldDic ve Dictionary<int, string> barList newDic. Şimdi her iki sözlükte de değerleri karşılaştırmam gerekiyor. Örnek için anahtar olabilir içindeLinq: İki farklı türde sözlük dışında

  • oldDic: 1,2,3
  • newDic: 1,2,3,4
  • Beklenen Çıktı: 4

Şimdi ben hem karşılaştırmak gerekir Anahtarları temelinde sözlükler takdir edilecektir.

Düzenleme: Çıktı, ikinci sözlük (newDic) gibi olmalı, ancak bu, 2. sözlüğün (oldDic) bazı değerini içerecektir. Örneğin

1 için "fooString" fooString daha açıklık getirmek Fooclass en someproperty bazı değer .... olduğu yerlerde benim için çalıştı etmeyen görüyoruz

var addedList = from list1 in baseListDic 
join list2 in trackerlist on list1.Key equals list2.Key 
select new { key = list1.Key, value = list1.Value._lead }; 

burada baseListDic oldDic ve trackerlist olduğunu newDic .... ... hala net değilim varsa bana

+1

IEnumerable sonuç = newDic.Keys.Except (oldDic.Keys) –

+0

@huMptyduMpty de ben bu denedim ama bu bir bana çıktıyı sadece 4. verir Ama aynı zamanda ... gözlerimi bkz fooClass bazı değerine ihtiyacımız Yukarıdaki gönderideki yeni düzenleme .. –

+0

Yeni düzenlemeniz orijinal örneğinizle aynı fikirde gibi görünmüyor. Orjinalinde newdic'te değil, eski dic'de olan anahtarı döndürüyorsunuz, fakat ikinci örneğinizde, newdic'te tuşları olan olddic'te değerler döndürüyor gibi görünüyorsunuz? İstediğinizi gösteren bazı örnek sözlüklerle küçük bir program oluşturabilirsiniz. Hiç kimsenin size kolay bir şekilde koyabilecekleri bir kod vermeyecek ... :) – Chris

cevap

9

Eski sözlükte aynı anahtara sahip öğeleri göz ardı eden yeni sözlüğe dayalı yeni bir sözlüğü oluşturmak daha kolay olurdu.

var result = newDic 
    .Where(kvp => !oldDic.ContainsKey(kvp.Key)) 
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 
5

not edelim : senin örneğin gibi görünüyor (vurgu benim) "i hem sözlüklerdedeğerleri karşılaştırmak gerekir" diyerek sorunuza rağmen sadece anahtarların karşılaştırmasını göstererek ben de bununla gittim. Eğer karşılaştırmanız gereken değerler varsa, ne demek istediğinizi ve kolayca dönüştürülebilir veya karşılaştırılabilir bir örnek vermek isteyebilirsiniz ...

Sadece anahtarları karşılaştırıyorsanız, o zaman sadece .Keys özelliğini kullanabilirsiniz. Eğer üzerinde linq yapabileceği bir IEnumerable<TKey> döndüren sözlüğe ...

örneğin:

var expectedOutput = newDic.Keys.Except(oldDic.Keys); 

Bu aynı tür olma anahtara itimat yok ama bu farkların istatistiksel eğer söylemeye gerek yok. Tabii ki, farklı türlerde bunu yapmak için wnat yaparsanız, önce türlerini dönüştürmekten vazgeçecek hiçbir şey yoktur.

Ayrıca o zaman böyle bir şey yapabileceğini sözlüklerde birinde değerlerini almak istiyorsa: bilirsin,

var newDicValues = expectedoutput.Select(x=>newDic[x]); 

Yoksa gibi hissediyorum başka linqy şeyler.Doğru anladıysam ayrı Sözlük Yani Sözlük denilen FinalDict anahtara sahip olacak ve bu Dictionary<int, Fooclass> FinalDict

  IEnumerable<int> list = OldDic.Keys.Except(NewDic.Keys); 
      foreach (var x in list) 
      { 
       var value =new MyClass(); 
       OldDic.TryGetValue(x,out value); 
       FinalDict.Add(x,value); 
      } 

gibi moething varsa :)

+0

senin çözüm de bana başka fikirler verdi ... –

0

, bu

gibi bir şey denemek ilgili Fooclass

Bu yardımcı olur

+0

beri tüm x eskiDic'ten gelip TryGetvalue kullanmanız gerekmemelidir ... Aslında bunun OldDic.Where (x =>! NewDic.ContainsKey (x.Key)) kadar basit olacağını düşünmüştüm. (x => x.Key, x => x.Value) – Chris

2

İki farklı liste arasındaki farkı bulmak için bunu deneyin: Herhangi bir ortak özelliği varsa.

var differentItems = List<Type1>.Select(d => d.Name) 
         .Except(List<Type2>.Select(d => d.Name));