2012-07-25 23 views
6

tengo 2 tipos diferentes de diccionarios Dictionary<int, Fooclass> oldDic y Dictionary<int, string> barList newDic. Ahora necesito comparar valores en ambos diccionarios. para el Ejemplo clave puede ser enLinq: excepto en dos tipos diferentes de diccionarios

  • oldDic: 1,2,3
  • newDic: 1,2,3,4
  • de salida esperado: 4

Ahora i necesidad de comparar ambas diccionarios en base a sus claves cualquier ayuda sería apreciada.

Edición: La salida debería ser como el segundo diccionario (newDic) pero este contendrá algún valor del 2 ° diccionario (oldDic). Por ejemplo

1, "fooString" ¿Dónde fooString es cierto valor en someproperty de FooClass .... Para mayor claridad véase el el que no funcionó para mí

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

aquí baseListDic es oldDic y es trackerlist newDic .... Avísame si todavía no estoy claro ...

+1

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

+0

@huMptyduMpty así que he intentado esto, pero éste me da salida solamente 4. Pero necesito algo de valor a partir de FooClass también ver a mi ... nueva edición en la publicación anterior. –

+0

Su nueva edición no parece estar de acuerdo con su ejemplo original. en su original, está devolviendo la clave que está en newdic pero no es antigua, pero en el segundo ejemplo parece que está devolviendo valores en olddic que tienen claves en newdic? ¿Tal vez crear un pequeño programa con algunos diccionarios de muestra que demuestren lo que quiere? Nadie se opondrá a que les proporciones un código que puedan ejecutar fácilmente ... :) – Chris

Respuesta

9

Sería más fácil crear un nuevo diccionario basado en el nuevo diccionario ignorando los elementos que tienen la misma clave en el diccionario anterior.

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

Nota: a pesar de su pregunta diciendo "tengo que comparar los valores en ambos diccionarios" (el énfasis es mío) su ejemplo parece ser demostrando solo una comparación de claves así que me he ido con eso. Si se trata de valores que debe comparar, es posible que desee dar un ejemplo de lo que quiere decir y si son fácilmente convertibles o comparables ...

Si solo compara las teclas, puede utilizar la propiedad .Keys del diccionario que devuelve un IEnumerable<TKey> que puede hacer su LINQ en ...

por ejemplo:

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

esto se basa en la clave de ser del mismo tipo pero esto es evidente si se está comparando. Por supuesto, no hay nada que te impida convertir sus tipos primero si lo haces para hacer esto con diferentes tipos.

también si quería a continuación, obtener los valores en uno de los diccionarios que podría hacer algo como:

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

O, ya sabes, hacer cualquier otra cosa linqy sentir como.:)

+0

su solución también me dio otras ideas ... gracias –

0

Si se entiende correctamente, intente algo como esto

si tiene un diccionario moething como esto 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); 
      } 

Así en el Diccionario llamada FinalDict tendrá la llave y relacionado Fooclass

Espero que esto ayude

+0

ya todas las x provienen de oldDic no debería necesitar usar TryGetvalue ... De hecho, hubiera pensado que esto sería más simple como 'OldDic.Where (x =>! NewDic.ContainsKey (x.Key)). ToDictionary (x => x.Key, x => x.Value) ' – Chris

2

Pruebe esto para obtener la diferencia entre dos listas diferentes: si tienen alguna propiedad en común.

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