2010-02-03 4 views
5

Tipo di titolo dice tutto. Non riesco a trovare l'opzione DictionaryOrDefault \ ListOrDefault \ CollectionOrDefault.Qual è la versione di raccolta di SingleOrDefault per un dizionario <T>?

Esiste un tale metodo? In caso contrario, come faccio questo:

MyClass myObject = MyDictionary 
    .SingleOrDefault(x => 
         { 
          if (x.Value != null) 
           return (x.Value.Id == sourceField.SrcField.Id); 
          else 
           return false; 
         }).Key; 

se c'è più di una corrispondenza? (Sto ottenendo un execption perché SingleOrDefault è destinato solo per i risultati singoli (immagino che!).)


Indovinate avevo bisogno di essere più chiaro (anche se i where risposte sembra buono).

Ho la dichiarazione di cui sopra. Ho cambiato il mio programma in modo che non restituisca sempre 1 (possono esserci più valori che corrispondono a una chiave). Non funziona così sto cercando una collezione da restituire (piuttosto che un solo articolo).

+0

piccolo chiarimento qui, si sta cercando di ottenere molti valori che misura un predicato, o solo uno, quale è? –

+1

"Tipo di titolo dice tutto." Non proprio, cosa intendi con 'DictionaryOrDefault'? Si prega di specificare la semantica prevista con attenzione, in modo chiaro e corretto. – jason

+1

quindi quello che vuoi è qualcosa che restituisce null se nulla corrisponde, o una lista se uno o più lo fa? –

risposta

4

È possibile utilizzare IEnumerable<T>.FirstOrDefault(Func<T, bool> predicate) se si intende restituire il primo corrispondente al predicato.

Altrimenti si sta semplicemente esaminando l'estensione di linea IEnumerable<T>.Where(Func<T, bool> predicate), che restituirà tutti gli elementi che corrispondono al predicato passato. Ciò restituirà uno IEnumerable<T> vuoto se nessun elemento corrisponde al predicato, a quel punto se hai davvero bisogno che il valore sia nullo, puoi semplicemente controllare se c'è qualcosa in esso.

var res = MyDictionary.Where(x => 
         { 
          if (x.Value != null) 
           return (x.Value.Id == sourceField.SrcField.Id); 

          return false; 
         }); 
if (!res.Any()) 
    res = null; 

Poi, se si assolutamente bisogno di avere come un elenco, si può chiamare

res.ToList(); 

Si noti che se si sta effettivamente manipolando un Dictionary<TKey, TValue>, res conterrà KeyValuePair<TKey, TValue> 's.

+0

Mi sento abbastanza stupido per non pensare a dove. Sono appena stato contorto. – Vaccano

1

se fai qualcosa di simile

var mylist = obj.Where(x=>x.attr1 == 4); 

si può quindi verificare se qualcosa è stato restituito con il metodo .Any()

mylist.Any() 
+0

Non chiamare .ToList() finché non è necessario. Anche se sai che ne hai bisogno subito, almeno salvalo per la riga successiva. –

+0

Lo ricorderò per la prossima volta, grazie per le informazioni. –

+0

@Joel - Ci sono degli svantaggi che chiamano ToList? (Ho pensato che fosse così, ma non lo sapevo mai ...) – Vaccano