2009-07-23 8 views
1

permet de regarder la structure suivante première (j'ai essayé de le simplifier pour montrer à quel genre de requête que je veux)seule requête LINQ pour la structure de données complexes: Dict <int, Dict <str, _class>>

class NameAddress 
    {  
     public string Name { get; set; } 
     public string Address { get; set; } 
     public NameAddress(string sName, string sAddress) { Name = sName; Address = sAddress; }  
    } 

    static void Main(string[] args) 
    { 
     Dictionary<int, Dictionary<string, NameAddress>> _dictionary = new Dictionary<int,Dictionary<string,NameAddress>>() 
      { 
      {/*int Key=*/1, /*Dictionary<str, NameAddress> value(1)=*/new Dictionary<string, NameAddress>() { {"First", new NameAddress("John Doe", "Mexico")}} }, 
      {/*int Key=*/2, /*Dictionary<str, NameAddress> value(2)=*/new Dictionary<string, NameAddress>() { {"Second", new NameAddress("Morris", "Washington")}, { "Third", new NameAddress("Keith", "New York")}} } 
      };  
    } 

I voulez interroger la structure de données suivante en utilisant une seule requête linq. Disons que je veux trouver le gars qui vit à New York et sa clé aussi. Les clés entières (_dictionary Keys) ne sont pas si importantes mais la chaîne Key (dans ce cas - "Third") est celle que je veux découvrir.

Est-il possible de trouver que la chaîne Key et le NameAddress particulier dans une seule requête linq? Si oui, quelle est cette requête?

Répondre

1

Notez que cette itère sur le dictionnaire (plutôt que d'utiliser l'indice), mais il fonctionne:

var found = (from outer in _dictionary 
       from inner in outer.Value 
       where inner.Value.Address == "New York" 
       select new { 
        OuterKey = outer.Key, 
        InnerKey = inner.Key, 
        NameAddress = inner.Value 
       }).FirstOrDefault(); 
+0

Je cherchais quelque chose comme ça seulement. Je ne savais pas comment faire la requête imbriquée. Merci –

+0

Je pense toujours que le mien est plus propre lol;) –

1

Cette structure de données n'est pas efficace pour prendre en charge cette opération. Si c'est une opération courante, vous devriez envisager un nouveau design.

Vérifiez les exigences de culture.

string address = "New York"; 
KeyValuePair<string, NameAddress> result = 
    _dictionary.Values 
       .SelectMany(value => value) 
       .FirstOrDefault(pair => pair.Value.Address.Equals(address, StringComparison.CurrentCultureIgnoreCase)); 
+0

Je suis d'accord, ce n'est pas efficace. J'essayais de faire une recherche inversée (pour le plaisir) et suis resté coincé. Par conséquent, demandé ici par curiosité. –

Questions connexes