J'apprends juste à programmer et je n'ai donc pas vraiment compris LINQ. J'ai:

Dictionary<string, Dictionary<string, string>> dirData = new Dictionary<string, Dictionary<string, string>>
{
    {
        "key1", new Dictionary<string, string>
        {
            {"subKey1", "value546" },
            {"subKey2", "value412" },
            {"subKey3", "value100" },
            {"subKey4", "value27" }
        }
    },
    {
        "key2", new Dictionary<string, string>
        {
            {"subKey1", "value27" },
            {"subKey2", "value98" },
            {"subKey3", "value100" }
        }
    },
    {
        "key3", new Dictionary<string, string>
        {
            {"subKey1", "value29" },
            {"subKey2", "value202" },
            {"subKey3", "value22" },
            {"subKey5", "value1" },
            {"subKey6", "value3" }
        }
    }
};

Je dois renvoyer le Dictionary<string, Dictionary <string, string >>subkey == "subKey3" avec la valeur value == "value100".

Comment cela peut-il être organisé à l'aide de LINQ?

3
Victor Akhremenka 20 nov. 2018 à 14:34

5 réponses

Meilleure réponse

Vous pouvez utiliser l'extrait de code suivant, il y en a deux dans votre exemple BTW:

var result = dirData.Values.Where(d => d.ContainsKey("subKey3") && d["subKey3"] == "value100");

Mettre à jour

I need to return the Dictionary<string, Dictionary <string, string >>
where subkey == "subKey3" with the value value == "value100".

Obtenez le dictionnaire des dictionnaires:

Dictionary<string,Dictionary<string,string>> result = dirData.Where(d => d.Value.ContainsKey("subKey3") && d.Value["subKey3"] == "value100").ToDictionary(k=>k.Key,v=>v.Value);
3
Access Denied 20 nov. 2018 à 11:50

Quelque chose dans le sens de

var vals = dirData.Where(x => x.Value.Keys.Contains("subKey1") && x.Value.Values.Contains(("value29")));

Devrait marcher. Je viens de le tester en utilisant vals.Count() et j'ai obtenu le numéro 1 de retour.

Aussi, juste pour avertir: il manque deux virgules dans vos sous-dictionnaires :)

Modifier : je pense que la réponse de @Access Denied est probablement meilleure. Je laisse le mien comme alternative.

1
Danny Goodall 20 nov. 2018 à 11:41

Pour compliquer un peu les choses, vous pouvez également utiliser l'objet Linq de cette façon

  var test =  from x in dirData
                           where x.Value.Any(m => m.Key == "subKey3" && m.Value == "value100")
                           select x;
1
mahlatse 20 nov. 2018 à 11:45

Voici une autre façon:

List<Dictionary<string, string>> result = dirData.Where(w => w.Value["subKey3"] == "value100").Select(s => s.Value).ToList();

Je présume que plus d'un des dictionnaires peuvent correspondre à la condition en fonction de vos exemples de données, par conséquent, cette instruction renvoie une liste de dictionnaires. Si vous n'attendez qu'une seule correspondance, vous devez remplacer ToList () par Single () / SingleOrDefault () selon le cas.

0
John M 20 nov. 2018 à 11:46

Probablement quelque chose comme

var data = dirData.Where(d => d.Value.Any(x => x.Key == "subKey3" && x.Value == "value100")).ToList();

Si vous recherchez uniquement les entrées où key = "subKey3" et value = "value100", utilisez probablement SelectMany() comme

var data = dirData.SelectMany(x => x.Value).Where(x => x.Key == "subKey3" && x.Value == "value100").ToList();
0
Rahul 20 nov. 2018 à 12:00