Sfondo
Recentemente sono in procinto di estenuanti interviste tecnologiche per posizioni che utilizzano lo stack .NET, alcuni dei quali includono domande stupide come questa , e alcune domande che sono più valide. Di recente mi sono imbattuto in un problema che potrebbe essere valido ma voglio verificarlo con la community qui per essere sicuro.
Quando ho chiesto ad un intervistatore come avrei calcolato la frequenza delle parole in un documento di testo e ho classificato i risultati, ho risposto che avrei
- Usa un oggetto flusso metti il file di testo in memoria come una stringa.
- Dividi la stringa in una matrice sugli spazi ignorando la punteggiatura.
- Usa LINQ contro l'array su
.GroupBy()
e.Count()
, poiOrderBy()
detto conteggio.
Ho sbagliato questa risposta per due motivi:
- Lo streaming di un intero file di testo nella memoria potrebbe essere disastroso. E se fosse stata un'intera enciclopedia? Invece dovrei eseguire lo streaming di un blocco alla volta e iniziare a costruire una tabella di hash.
- LINQ è troppo costoso e richiede troppi cicli di elaborazione. Avrei dovuto invece creare una tabella hash e, per ogni iterazione, aggiungere solo una parola alla tabella hash se non esisteva altrimenti e quindi incrementarne il conteggio.
La prima ragione sembra, beh, ragionevole. Ma il secondo mi dà più pausa. Ho pensato che uno dei punti di forza di LINQ è che semplicemente astrae le operazioni di livello inferiore come le tabelle hash ma che, sotto il velo, è sempre la stessa implementazione.
Domanda
A parte alcuni cicli di elaborazione aggiuntivi per chiamare qualsiasi metodo astratto, LINQ richiede significativamente più cicli di elaborazione per eseguire una determinata attività di iterazione dei dati rispetto a un'attività di livello inferiore (come la costruzione di una tabella hash ) sarebbe?