Hintergrund
Ich bin in letzter Zeit dabei, anstrengende Tech-Interviews für Positionen zu ertragen, die den .NET-Stack verwenden, von denen einige dumme Fragen wie diese enthalten , und einige Fragen, die gültiger sind. Ich bin kürzlich auf ein Problem gestoßen, das möglicherweise gültig ist, aber ich möchte mich hier bei der Community erkundigen, um sicherzugehen.
Auf die Frage eines Interviewers, wie ich die Häufigkeit von Wörtern in einem Textdokument zählen und die Ergebnisse bewerten würde, antwortete ich, dass ich dies tun würde
- Verwenden Sie ein Stream-Objekt, um die Textdatei als Zeichenfolge zu speichern.
- Teilen Sie die Zeichenfolge in ein Array auf Leerzeichen auf, während Sie die Interpunktion ignorieren.
- Verwenden Sie LINQ für das Array
.GroupBy()
und.Count()
dann dieOrderBy()
Anzahl.
Ich habe diese Antwort aus zwei Gründen falsch verstanden:
- Das Streamen einer gesamten Textdatei in den Speicher kann katastrophal sein. Was wäre, wenn es eine ganze Enzyklopädie wäre? Stattdessen sollte ich jeweils einen Block streamen und mit dem Erstellen einer Hash-Tabelle beginnen.
- LINQ ist zu teuer und erfordert zu viele Verarbeitungszyklen. Ich hätte stattdessen eine Hash-Tabelle erstellen und für jede Iteration nur ein Wort zur Hash-Tabelle hinzufügen sollen, wenn es sonst nicht vorhanden wäre, und dann die Anzahl erhöhen.
Der erste Grund scheint vernünftig. Aber der zweite gibt mir mehr Pause. Ich dachte, dass eines der Verkaufsargumente von LINQ darin besteht, dass es einfach Operationen auf niedrigerer Ebene wie Hash-Tabellen abstrahiert, aber dass es unter dem Schleier immer noch dieselbe Implementierung ist.
Frage
Erfordert LINQ, abgesehen von einigen zusätzlichen Verarbeitungszyklen zum Aufrufen abstrahierter Methoden, erheblich mehr Verarbeitungszyklen, um eine bestimmte Dateniterationsaufgabe auszuführen, als dies bei einer untergeordneten Aufgabe (z. B. beim Erstellen einer Hash-Tabelle) der Fall wäre?