/ / linq one liner pour supprimer des éléments d'IDictionary dont les clés ne se trouvent pas dans un autre dictionnaire - c #, linq, .net-4.0, dictionary

linq one liner pour supprimer des éléments d'IDictionary dont les clés ne se trouvent pas dans un autre dictionnaire - c #, linq, .net-4.0, dictionary

j'ai

IDictionary<string,object> d1;
Dictionary<string, object> d2;

Je dois supprimer de d1 toutes les entrées qui ne sont pas dans d2.

Je sais que je peux le faire avec une boucle for, etc., mais c’est tellement le siècle dernier; je veux le faire correctement.

je dois

   d1.Where(x => {return d2.ContainsKey(x.key);});

mais je ne sais pas quoi faire ensuite

Réponses:

3 pour la réponse № 1

LINQ n’est pas conçu pour modifier éléments existants - mais vous pouvez toujours créer un Nouveau dictionnaire. Par exemple:

d1 = d1.Where(x => d2.ContainsKey(x.Key))
.ToDictionary(x => x.Key, x => x.Value);

Ou:

d1 = d1.Keys.Intersect(d2.Keys)
.ToDictionary(key => x.Key, key => d1[key]);

Comme d’autres l’ont dit, si vous êtes plus enclin à faire une Remove opération, je viens de faire une boucle. Par exemple:

foreach (var key in d1.Keys.Except(d2.Keys).ToList())
{
d1.Remove(key);
}

(Je ne suis pas sûr de savoir pourquoi vous avez utilisé une instruction lambda dans votre exemple de code, en passant.)


1 pour la réponse № 2

LINQ est pour interroger. Les informations que vous "re interroger est les clés de d1 qui ne sont pas dans d2. Autre que manquer un NOT (à moins que vous ne vouliez pas dire "non" dans vos exigences), vous l’avez déjà. Faire quelque chose, qui est mieux fait avec un foreach boucle, pas LINQ:

foreach(var pair in d1.Where(x=> !d2.ContainsKey(x.Key)).ToList())
{
d1.Remove(pair.Key)
}

Notez que le ToList est nécessaire pour vous assurer que vous ne modifiez pas une collection lors de son itération.