2012-05-03 5 views
13

Ho dizionario che contiene i miei libri: definitoncontrollo se il valore esiste già

Dictionary<string, book> books 

libro:

class book 
{ 
    string author { get; set; } 

    string title { get; set; } 
} 

ho aggiunto alcuni libri al dizionario.

Come posso verificare se nel dizionario è presente un libro che corrisponde al titolo fornito dall'utente?

+3

Quale valore stai fornendo per la parte 'stringa' di ''? – zimdanen

risposta

19

Se non si utilizza il titolo del libro come chiave, sarà necessario enumerare i valori e vedere se alcuni libri contengono quel titolo.

foreach(KeyValuePair<string, book> b in books) // or foreach(book b in books.Values) 
{ 
    if(b.Value.title.Equals("some title", StringComparison.CurrentCultureIgnoreCase)) 
     return true 
} 

Oppure si può usare LINQ:

books.Any(tr => tr.Value.title.Equals("some title", StringComparison.CurrentCultureIgnoreCase)) 

Se, d'altra parte, si sta utilizzando il titolo di libri come la chiave, allora si può semplicemente fare:

books.ContainsKey("some title"); 
+0

GRAZIE, il tuo primo codice ha aiutato, che arriva a LINQ, non l'ho mai provato prima – Bublik

+0

@ user1224225 Questa dovrebbe essere la risposta accettata – Antonio

+0

C'è .ContainsValue attualmente nella versione più recente di .net framework. Vedere @ https://msdn.microsoft.com/en-us/library/a63811ah(v=vs.110).aspx – Nikola

24
books.ContainsKey("book name"); 
+4

Vuole sapere se contiene un libro (valore di dictionnary) con una proprietà del titolo conosciuta, penso, non la chiave di dizionario. – Amaranth

+1

dal momento che OP ha selezionato questo, potrebbe essere quello che stava chiedendo esattamente .. – nawfal

1

Nel tuo dizionario, la chiave contiene il titolo? In caso affermativo, utilizzare ContainsKey come le altre risposte. Se la chiave è un'altra cosa, e si desidera controllare title l'attributo del valore (dell'oggetto Book), che avrebbe dovuto farlo manualmente in questo modo:

foreach(KeyValuePair<string,book> kvp in books) { 
    if (kvp.Value.title == "some title") 
     return kvp.Key; 
} 

return String.Empty; //not found 
4

Se si è permesso di usare LINQ, provare a utilizzare il codice qui sotto:

bool exists = books.Any(b => (b.Value != null && b.Value.title == "current title"));