2011-12-23 18 views
9

Ho un Dictionary<string, User>.Come ottenere voce dal dizionario per valore della proprietà

User è un oggetto con le proprietà UID, UNIQUE KEY e altro. La mia chiave di dizionario è UNIQUE KEY degli utenti.

Ora, voglio ottenere un User dai miei valori del dizionario da un UID e non la chiave, qualcosa come ContainsKey .. come il suo fare con espr lambda o LINQ? c'è una buona soluzione per questo?

+2

si prega di inviare il codice che avete finora (se presente). Se non ne hai ancora, scrivilo e torna quando puoi fornire un esempio. – Adam

risposta

15

Ecco un esempio di lavoro:

using System; 
using System.Collections.Generic; 
using System.Linq; 

internal class User 
    { 
     public string ID { get; set; } 

     public string Name { get; set; } 
    } 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      Dictionary<string, User> dic = new Dictionary<string, User>(); 
      dic.Add("1", new User { ID = "id1", Name = "name1" }); 
      dic.Add("2", new User { ID = "id2", Name = "name2" }); 
      dic.Add("3", new User { ID = "id3", Name = "name3" }); 

      User user = dic.Where(z => z.Value.ID == "id2").FirstOrDefault().Value; 

      Console.ReadKey(); 
     } 
    } 
+0

Notazione più breve : Utente utente = dic.FirstOrDefault (z => z.Value.ID == "id2"). Valore; E ha bisogno anche di un controllo NULL su FirstOrDefault per evitare NullReferenceException sul valore;) –

+0

Oppure controlla questa risposta con Don John Corleone Skeet per una discussione: http://stackoverflow.com/questions/5424968/dictionary-firstordefault-how -to-stabilire-se-a-risultato-è stata ritrovata –

5
return dict.Single(x => x.Value.UID == target); 

Naturalmente, si potrebbe scoprire che il vostro disegno è discutibile se si tratta di continuo facendo ricerche lineari attraverso una Dictionary.

1

Naturalmente perderai il vantaggio di avere un dizionario, ma si può fare someting come:

var user = dict.Values.FirstOrDefault(k=>k.UID==xxxx); 
+0

'FirstOrDefault' accetta un predicato opzionale che, se fornito, si prenderà cura del filtro (cioè dict.Values.FirstOrDefault (k => k.UID == xxxx)'.) – mquander

+0

@mquander grazie, aggiornato –

0

Questo dovrebbe ottenere l'utente per la UID dal dizionario:

public User GetUserForUid(Dictionary<string, User> dictionary, int uid) 
{ 
    return dictionary.Values.FirstOrDefault(u => u.UID == uid); 
} 
Problemi correlati