Sia Single
e SingleOrDefault
sarà enumerare la raccolta oltre il primo risultato corrispondente per verificare che sia esattamente un elemento corrispondenti ai criteri, fermandosi alla prossima partita o alla fine della raccolta. Il primo esempio sarà leggermente più lento, poiché la chiamata Any
enumererà una quantità sufficiente della raccolta (possibilmente tutta) per determinare se alcuni elementi soddisfano i criteri, fermandosi alla prima corrispondenza o alla fine della raccolta.
C'è un'altra differenza fondamentale: il primo esempio potrebbe generare un'eccezione. Single
restituirà l'elemento corrispondente se esiste esattamente uno e genera un'eccezione in caso contrario. Il controllo con Any
non verifica questo; verifica solo che ci sia almeno uno.
Sulla base di questi due motivi (principalmente/soprattutto il secondo motivo), l'approccio SingleOrDefault
è preferibile qui.
Quindi, ci sono tre casi qui.
Caso 1: Nessun articolo corrisponde alla condizione di
Opzione 1: .Any
enumera l'intero set e restituisce false; .Single
non esegue mai.
Opzione 2: .SingleOrDefault
enumera l'intero set e restituisce null.
Opzioni essenzialmente equivalenti.
Caso 2: Esattamente un elemento corrisponde la condizione
Opzione 1: Any
enumera abbastanza del set di trovare la singola partita (potrebbe essere il primo elemento, potrebbe essere l'intero set). Quindi, Single
enumera l'intero set per trovare quell'elemento e confermare che nessun altro corrisponde alla condizione.
L'opzione 2: SingleOrDefault
enumera l'intero set, restituisce l'unica corrispondenza.
In questo caso, l'opzione 2 è migliore (esattamente un iterazione, rispetto a (1, 2] iterazioni)
Caso 3: più di un elemento corrisponde la condizione
Opzione 1: Any
enumera abbastanza per trovare la prima corrispondenza: il numero Single
enumera abbastanza per trovare la seconda corrispondenza, genera un'eccezione
L'opzione 2: SingleOrDefault
enumera abbastanza per trovare la seconda corrispondenza, genera un'eccezione.
Entrambi generano eccezioni, ma l'opzione 2 arriva più rapidamente. .
I _imagine_ (anche se non ho fatto un punto di riferimento) che 'SingleOrDefault' è più performante di' Any'. Quando si parla di Linq, c'è spesso più di un modo per fare qualcosa. Sceglierei l'opzione che ha più senso per te. –
Chiamando Qualsiasi poi Single accede alla lista persone due volte come SingleOrDefault solo una volta. Per quanto riguarda le prestazioni, probabilmente la seconda opzione sarebbe la migliore (anche se non ho effettuato test su questo!) – Ric