2012-01-16 4 views
0

J'ai joué avec linq ce matin et j'ai des questions sur la comparaison de deux dictionnaires. Je veux comparer deux dicionnaires et rendre la différence. Je suis capable de produire la sortie désirée en minuplant la requête dans ma boucle foreach. Cependant, je me demande s'il y a un opérateur qui me permettrait de simplifier un peu plus. Ci-dessous j'ai énuméré le code que je voudrais simplifier.différence entre deux dictionnaires en utilisant linq

var _ItemsBefore = new SortedDictionary<int, int>() { { 1, 12 }, { 2, 12 } }; 
var _ItemsAfter = new SortedDictionary<int, int>() { { 1, 11 }, { 2, 8 } { 3, 1 } }; 

foreach(var item in _ItemsAfter.Except(_ItemsBefore)) 
{ 
    if(_ItemBefore.ContainsKey(item.Key)) 
    Console.WriteLine(string.format("{0} {1}", item.Key, _ItemsAfter[item.Key] -_ItemsBefore[item.Key])); 
    else 
    Console.WriteLine(string.format("{0} {1}", item.Key, item.Value) 
} 

results 
1 -1 
2 -4 
3 1 
+1

Si le premier dictionnaire a {5,10} quel est le résultat de votre sortie? –

+0

Ce serait le même résultat. Je ne suis intéressé que par ce qui a changé. Vous pensez à cela en termes d'inventaire. Avant est tous les articles au début de la journée, après est des éléments à la fin. Vous avez peut-être vendu des articles ou des articles reçus pendant la journée. Je suis intéressé par ce que j'ai vendu et ce que j'ai reçu? J'espère que je suis clair. – poco

Répondre

2

Par vos besoins, Ceci est une version LINQ, mais ce n'est pas aussi lisible que votre for version boucle:

var result = _ItemsAfter 
      .Except(_ItemsBefore) 
      .Select(x => _ItemsBefore.ContainsKey(x.Key) ? 
        new KeyValuePair<int, int>(x.Key, x.Value - _ItemsBefore[x.Key]) : 
        new KeyValuePair<int, int>(x.Key, x.Value)).ToList(); 
+0

Merci Saeed, je pensais qu'il y avait un format plus simple. Je vais rester avec ma boucle foreach pour la facilité de lecture. – poco

0

Vous voudrez peut-être prudent sur la façon dont vous stockez un manque d'éléments, Si vous supprimez des valeurs alors que vous n'avez aucun inventaire, vous n'imprimerez pas cette réduction dans l'inventaire. Cependant, si vous stockez 0, vous ne devriez pas avoir de problème.

+0

ce ne sera jamais le cas monsieur. Mon exemple d'éléments dans le commnt ci-dessus était juste pour clarifier ce que j'étais après. Avant et après sont simplement des instantanés des dictionnaires à un moment précis. Aucun ajout ou suppression, juste comparaison. – poco

+0

@poco: Ah, juste s'assurer que le fait que les données dans Avant, mais pas dans Après ne pas être inclus dans les résultats était approprié. – Guvante

Questions connexes