2012-07-25 17 views
6

Ich habe 2 verschiedene Arten von Wörterbüchern Dictionary<int, Fooclass> oldDic und Dictionary<int, string> barList newDic. Jetzt muss ich Werte in beiden Wörterbüchern vergleichen. für Beispiel kann der Schlüssel inLinq: Außer zwei verschiedenen Arten von Wörterbüchern

  • oldDic: 1,2,3
  • newDic: 1,2,3,4
  • Erwartete Ausgabe: 4

Jetzt muss ich beide vergleichen Wörterbücher auf der Basis ihrer Schlüssel jede Hilfe wäre willkommen.

Edit: Ausgabe sollte wie zweites Wörterbuch (newDic) sein, aber dies wird einige Wert des 2. Wörterbuchs (oldDic) enthalten. Zum Beispiel

1 "fooString" Wo fooString ist etwas Wert in Fooclass der someproperty .... für mehr Klarheit dies zu sehen, die für mich nicht

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 }; 
arbeitete

hier baseListDic ist oldDic und trackerlist ist newDic .... Lassen Sie mich wissen, wenn ich bin immer noch nicht klar, ...

+1

IEnumerable result = newDic.Keys.Except (oldDic.Keys) –

+0

@huMptyduMpty gut, ich habe schon versucht, diese aber dies gibt mir nur ausgegeben, 4. Aber ich brauche etwas Wert von fooClass auch ... meine sehen Neue Bearbeitung in obigem Post. –

+0

Ihre neue Bearbeitung scheint nicht mit Ihrem ursprünglichen Beispiel übereinzustimmen. in deinem original gibst du den schlüssel zurück, der in newdic ist, aber nicht alt dic, aber in deinem zweiten beispiel scheinst du werte in olddic zurück zu geben, die schlüssel in newdic haben? Vielleicht erstellen Sie ein kleines Programm mit einigen Beispielwörterbüchern, die zeigen, was Sie wollen? Niemand wird jemals etwas dagegen einwenden, dass er ihnen einen Code gibt, den sie leicht ausführen können ... :) – Chris

Antwort

9

Es wäre einfacher, ein neues Wörterbuch auf der Grundlage des neuen Wörterbuchs zu erstellen, das Elemente ignoriert, die den gleichen Schlüssel im alten Wörterbuch haben.

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

Hinweis: Trotz Ihrer Frage sagen „i Werte in beiden Wörterbücher vergleichen müssen“ (Hervorhebung von mir) Ihrem Beispiel zu sein scheint demonstrieren nur Vergleich von Schlüsseln, also bin ich damit gegangen. Wenn es Werte sind, die Sie vergleichen müssen, können Sie ein Beispiel dafür geben, was Sie meinen und ob sie leicht konvertierbar oder vergleichbar sind ...

Wenn Sie nur die Schlüssel vergleichen, können Sie einfach die .Keys Eigenschaft verwenden des Wörterbuchs, die eine IEnumerable<TKey> zurückgibt, die Sie Linq tun können auf ...

zB:

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

diese auf dem Schlüssel nicht verlassen, um den gleichen Typ zu sein, aber das ist selbstverständlich, wenn Sie vergleichen. Natürlich gibt es nichts, was Sie davon abhält, ihre Typen zuerst zu konvertieren, wenn Sie dies mit verschiedenen Typen machen möchten.

Auch wenn Sie die Werte in einem der Wörterbücher dann wollten Sie so etwas wie tun könnte:

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

Oder Sie wissen, tun andere linqy Sachen, die Sie Lust haben.:)

+0

Ihre Lösung gab mir noch ein paar andere Ideen..danke –

0

Wenn richtig verstanden habe, versuchen, so etwas wie dieses

, wenn Sie ein separates Wörterbuch haben moething wie diese 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); 
      } 

So im Wörterbuch genannt FinalDict den Schlüssel haben und verwandt Fooclass

Hoffe, das hilft

+0

seit Alle x kamen von oldDic, du solltest TryGetvalue nicht benutzen müssen ... Eigentlich hätte ich gedacht, dass dies einfacher wäre als 'OldDic.Where (x =>! NewDic.ContainsKey (x.Key)). ToDictionary (x => x.Key, x => x.Wert) ' – Chris

2

Versuchen Sie dies, um den Unterschied zwischen zwei verschiedenen Liste zu bekommen: Wenn sie gemeinsame Eigenschaft haben.

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