C'è un modo molto performante per verificare che una raccolta abbia esattamente 1 elemento?

3

Ho trovato questa soluzione:

if (Take(2).Count() == 1)

c'è qualche altra soluzione per le prestazioni (o meglio zucchero sintattico) per fare questo controllo? Voglio un modo di performance perché questa sarà un'estensione usata su Linq To Entites e Linq to Objects.

Non sto utilizzando SingleOrDefault perché questo genererà ed eccezione se ha più di 1 elemento.

In base alla risposta @Telastyn ho trovato il seguente:

public static bool HasOne<T>(this IEnumerable<T> enumerable) {
    var enumerator = enumerable.GetEnumerator();
    return enumerator.MoveNext() && !enumerator.MoveNext();
}

un'altra implementazione (leggermente più lenta ma sicura al 100% funzionerà efficacemente su Linq su Entità) sarebbe:

public static bool HasOne<T>(this IEnumerable<T> enumerable) {
    return !enumerable.FirstOrDefault().Equals(default(T)) && !enumerable.Skip(1).Any();
}

Non sono sicuro che MoveNext si lavori con IQueryable su Linq su Entites. (tutti gli acquirenti? Non so come testarlo)

Dopo alcuni test, Take(2).Count() == 1 ; è il più veloce : S

    
posta Bart Calixto 15.08.2014 - 02:07
fonte

1 risposta

4

Sì, la creazione della propria estensione che restituisce false sulla seconda percentuale riuscita diMoveNext (o nessuna) dovrebbe essere l'implementazione più performante per IEnumerable . Qualsiasi cosa con una proprietà Count dovrebbe solo verificare se è uguale a uno.

    
risposta data 15.08.2014 - 02:22
fonte

Leggi altre domande sui tag