C# de la Fusion de 2 dictionnaires
Je suis de développer une application en C# ciblage .NET 3.5. J'ai 2 similaires dictionnaires qui contiennent des critères de validation pour un ensemble spécifique d'éléments dans mon application. Les deux dictionnaires ont les mêmes signatures. Le premier dictionnaire a les paramètres par défaut et le 2ème dictionnaire contient certains paramètres définis par l'utilisateur.
var default_settings = new Dictionary<string, MyElementSettings>();
var custom_settings = new Dictionary<string, MyElementSettings>();
Je voudrais combiner les 2 dictionnaires en un qui contient les éléments des deux dictionnaires.
Le problème que je suis en cours d'exécution, c'est qu'il est possible pour les deux dictionnaires d'avoir certains des mêmes valeurs de clé. La règle de base que je veux, c'est une combinaison à la fois dictionnaire et si il y a toutes les clés en les custom_settings qui existent déjà dans le default_settings, le custom_settings de la valeur de remplacer le default_settings valeur. La meilleure solution que j'ai est juste une boucle foreach, vérifiez si la clé existe dans l'autre dictionnaire, et si non, ajouter.
foreach (var item in custom_settings)
{
if (default_settings.ContainsKey(item.Key))
default_settings[item.Key] = item.Value;
else
default_settings.Add(item.Key, item.Value);
}
J'ai fait de la base des requêtes LINQ, mais je travaille toujours sur l'apprentissage, les trucs les plus avancés. J'ai vu un peu les requêtes qui va fusionner 2 dictionnaires, mais la plupart comportent un groupement de n'importe quel élément avec des doubles de clés, ou seulement retourner une collection avec juste le double des clés/Est-il une requête LINQ ou l'expression de mimer le comportement de la boucle foreach, je suis en utilisant?
Vous devez vous connecter pour publier un commentaire.
Deux points:
De sorte que votre
foreach
boucle est essentiellement équivalent à:Maintenant c'est assez laconique déjà, donc je ne pense pas que LINQ va vous aider beaucoup.
Voici une belle extension de la méthode basée sur l'Ani de réponse.
IEnumerable<Dictionary<TKey, TValu>>
comment les comparer?Si vous allez faire beaucoup, alors je vous recommande la rédaction d'un comparateur d'égalité pour les clés de dictionnaire:
Et puis à chaque fois que vous avez besoin de fusionner des dictionnaires, vous pouvez effectuer les opérations suivantes
KeyEqualityComparer
classe/paramètre. MerciJe pense que la réponse que j'ai choisi à l'origine est toujours la meilleure réponse pour ce cas particulier, je me suis retrouvé dans une autre situation similaire il y a peu, où j'ai eu 2
IEnumerable<>
les objets que je voulait se convertir à un dictionnaire et se confondent dans un mode similaire alors j'ai pensé que je voudrais ajouter que la solution ici pour aider quelqu'un dans le futur. Plutôt que de convertir à la fois à un dictionnaire et à l'aide de la méthode le choix de la réponse, j'ai trouvé une nouvelle approche.J'ai effectivement posté le solution initiale sur SOI-CodeReview et effectivement eu une suggestion pour l'améliorer davantage. Voici le dernier code que j'ai utilisé:
La clé, c'est
Foo
doit remplacerEquals()
de définir ce queFoo
les objets peuvent être considérés comme des doublons, et les membres qui définissent les objets sont en double devraient également être de laDictionary<>
clé (dans ce casName
)Si vous ne pouvez pas remplacer
Equals()
dansFoo
, puis l'autre option est d'utiliserConcat()
etGroupBy()
au lieu deUnion()