2012-07-25 9 views
6

ho 2 diversi tipi di dizionari Dictionary<int, Fooclass> oldDic e Dictionary<int, string> barList newDic. Ora ho bisogno di confrontare i valori in entrambi i dizionari. per esempio chiave può essere inLinq: Tranne su due diversi tipi di dizionari

  • oldDic: 1,2,3
  • newDic: 1,2,3,4
  • Output previsto: 4

ora ho bisogno di confrontare sia dizionari sulla base delle loro chiavi qualsiasi aiuto sarebbe apprezzato.

Modifica: L'output dovrebbe essere come il secondo dizionario (newDic) ma conterrà qualche valore del secondo dizionario (oldDic). Per esempio

1, "fooString" Dove fooString è un certo valore in someproperty di FooClass .... Per maggiore chiarezza vedere questo, che non ha funzionato per me

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

qui baseListDic è oldDic e trackerlist è newDic .... Fammi sapere se non sono ancora chiare ...

+1

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

+0

@huMptyduMpty ben Ho provato questo ma questo mi dà uscita solo 4. Ma ho bisogno di un certo valore da FooClass anche vedere il mio ... nuova modifica nel post precedente .. –

+0

La tua nuova modifica non sembra essere d'accordo con il tuo esempio originale. nel tuo originale stai restituendo la chiave che è in newdic ma non vecchio dic, ma nel tuo secondo esempio sembra che tu stia restituendo valori in olddic che hanno chiavi in ​​newdic? Magari creare un piccolo programma con alcuni dizionari di esempio che dimostrino quello che vuoi? Nessuno potrà mai obiettare a te dando loro del codice che possono eseguire facilmente ... :) – Chris

risposta

9

Sarebbe più semplice creare un nuovo dizionario basato sul nuovo dizionario ignorando gli elementi che hanno la stessa chiave nel vecchio dizionario.

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

Nota: Nonostante la tua domanda dicendo "Ho bisogno di confrontare i valori in entrambi i dizionari" (sottolineatura mia) il vostro esempio sembra essere dimostrando solo il confronto di chiavi, quindi sono andato con quello. Se si tratta di valori che è necessario confrontare si potrebbe dare un esempio di cosa intendi e se sono facilmente convertibili o comparabili ...

Se si stanno effettivamente confrontando le chiavi, è sufficiente utilizzare la proprietà .Keys del dizionario, che restituisce un IEnumerable<TKey> che si può fare il vostro LINQ su ...

esempio:

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

Ciò contare sulla chiave è dello stesso tipo, ma questo va da sé, se si confrontano. Ovviamente, non vi è nulla che ti impedisca di convertire i loro tipi prima se vuoi farlo con tipi diversi.

Anche se si voleva quindi ottenere i valori in uno dei dizionari si potrebbe fare qualcosa di simile:

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

Oppure, sai, fare qualsiasi altra roba linqy ti senti come.:)

+0

la tua soluzione mi ha dato qualche altra idea anche ... grazie –

0

Se capito bene, provare qualcosa di simile

se si dispone di un dizionario separata moething come questo 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); 
      } 

Così nel dizionario chiamato FinalDict avrà la chiave e related Fooclass

Spero che questo aiuti

+0

dal tutta la x proveniva da oldDic non dovevi usare TryGetvalue ... In effetti avrei pensato che sarebbe stato più semplice come 'OldDic.Where (x =>! NewDic.ContainsKey (x.Key)). ToDictionary (x => x.Key, x => x.Value) ' – Chris

2

Prova questo per ottenere la differenza tra due diversi elenchi: Se hanno una proprietà comune.

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