Risultato LINQ più efficiente per la query Contains ()

0

Attualmente utilizzo il seguente:

var result = list.Union(otherList).SelectMany(l => l.children).ToList()

foreach(var child in lotsOfChildren){
    something = result.Contains(child)
}

Uso solo result per le query se l'elenco contiene elementi, utilizzando result.Contains(x) .

Questo aspetto è inefficiente per me, poiché presumibilmente Contains() deve enumerare l'intero elenco (statico) ogni volta, per verificare se un elemento è contenuto.

Ho notato metodi di estensione ToDictionary() e ToLookup() , tuttavia entrambi richiedono una chiave da definire, che non è necessaria.

Immagino che quello che cerco davvero sia una sorta di cosa di ToHashSet() - dovrei creare questo manualmente, come in .ToLookup(c => c.GetHashCode, c => c) ? O c'è un metodo integrato che mi manca? O , in alternativa, è qualcosa che il compilatore ottimizzerà e non ho bisogno di preoccuparmi.

    
posta Chris 13.03.2015 - 12:37
fonte

1 risposta

6

Puoi banalmente definire un metodo di estensione per ToHashSet se è quello che stai cercando.

public static class Extensions
{
    public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
    {
        return new HashSet<T>(source);
    }
}

Ora dovresti essere in grado di usarlo nell'esempio originale:

var result = list.Union(otherList).SelectMany(l => l.children).ToHashSet()

foreach (var child in lotsOfChildren)
{
    something = result.Contains(child)
}
    
risposta data 13.03.2015 - 13:23
fonte

Leggi altre domande sui tag