Hai assolutamente bisogno di queste enormi raccolte nel tuo livello aziendale?
Da dove vengono queste enormi collezioni? Se, ad esempio, provengono da un database, potrebbe essere una buona idea filtrare / contare / sommare il risultato sul lato del database delle cose. Ciò consentirà di risparmiare un sacco di potenza di elaborazione e memoria.
Il tuo programma è assolutamente necessario per gestire queste enormi collezioni?
In caso contrario, prova a ottimizzare le dimensioni delle tue raccolte prima che entrano nel tuo livello aziendale.
In ogni caso ...
Una risposta un po 'particolare per C #:
Se le prestazioni sono di enorme importanza, allora dovrà implementare alcuni di questi metodi, se è solo un "one-time" -thing, usa foreach
con un count
locale -variabile. Però; solo chiamare .Count()
su una grande raccolta non è un'operazione enormemente pesante di per sé, purché l'enumerazione di ogni oggetto non richieda un'enorme quantità di potenza / tempo di elaborazione, nel qual caso dovresti probabilmente fare attenzione a come molti elementi che enumeri (vale a dire Take
). Pertanto, la creazione di metodi come questi potrebbe essere considerata micro-ottimizzazione, ovvero se la raccolta conterrà sempre 1 milione di elementi o meno.
Un altro modo per affrontare il problema è enumerare IEnumerable<T>
in una raccolta di qualche tipo - List<T>
, per esempio.
Ciò richiede solo l'enumerazione one , che fornirà le informazioni sulla raccolta, come .Count
e l'accesso indicizzato agli elementi al suo interno.
Questo ovviamente dipende dal fatto che tu esegua o meno più operazioni sulla raccolta, poiché deve essere enumerato almeno una volta.
Cerca di essere pragmatico, poniti le semplici domande. Avrò bisogno di un accesso indicizzato agli articoli? Ho bisogno del conteggio? Devo assicurarmi che ci siano almeno quindici elementi? Avrò bisogno di eseguire più enumerazioni della collezione? Questa collezione sarà enorme? Quindi lavora semplicemente da lì, non esiste un modo magico corretto che sempre funzioni, devi assolutamente devi fare trade-off.
Ad un certo punto del codice, potrebbe essere una buona idea iterare solo 10 elementi, solo per verificare se contiene 10 o più oggetti, in un altro posto; chiamare Count()
potrebbe essere un'idea migliore.
Ad un certo punto del codice, enumerare la tua collezione su List<T>
potrebbe essere una buona idea, in altri punti - potrebbe non farlo.
Inoltre, C # ha già delle ottime funzionalità "voglio solo X" - si trova all'interno di Linq, ad esempio Take
.
Esempio di codice:
if (hugeCollection.Take(4).Count() == 4)
{
Foo();
}
Questo non enumera l'intera collezione, solo i primi 4 elementi, due volte . Quale per le piccole raccolte potrebbe non essere così eccezionale, ma per collezioni più grandi, certo.
Un tidbit C #:
Se .Any()
o .Count()
è più veloce dipende dal fatto che la chiamata sia effettuata su ICollection<T>
o meno. Per ICollection<T>
, Microsoft è andato avanti e l'ha ottimizzato , guardando il .Count
-property; che è marginalmente più veloce di chiamare .Any()
, indipendentemente dalle dimensioni delle raccolte, poiché la raccolta non dovrà mai essere enumerata.