Antecedentes
Recientemente estoy en el proceso de soportar entrevistas tecnológicas extenuantes para puestos que usan la pila .NET, algunas de las cuales incluyen preguntas tontas como esta , y algunas preguntas que son más válidas. Recientemente me encontré con un problema que puede ser válido, pero quiero consultar con la comunidad aquí para estar seguro.
Cuando un entrevistador me preguntó cómo contaría la frecuencia de las palabras en un documento de texto y clasificaría los resultados, respondí que lo haría
- Utilice un objeto de secuencia para colocar el archivo de texto en la memoria como una cadena.
- Divida la cadena en una matriz en espacios mientras ignora la puntuación.
- Use LINQ contra la matriz
.GroupBy()
y.Count()
luegoOrderBy()
dicho recuento.
Recibí esta respuesta incorrecta por dos razones:
- Transmitir un archivo de texto completo a la memoria podría ser desastroso. ¿Y si fuera una enciclopedia completa? En cambio, debería transmitir un bloque a la vez y comenzar a construir una tabla hash.
- LINQ es demasiado costoso y requiere demasiados ciclos de procesamiento. Debería haber creado una tabla hash y, para cada iteración, solo agregar una palabra a la tabla hash si no existiera y luego aumentar su recuento.
La primera razón parece, bueno, razonable. Pero el segundo me da más pausa. Pensé que uno de los puntos de venta de LINQ es que simplemente abstrae las operaciones de nivel inferior como las tablas hash, pero que, bajo el velo, sigue siendo la misma implementación.
Pregunta
Además de unos pocos ciclos de procesamiento adicionales para llamar a métodos abstraídos, ¿LINQ requiere significativamente más ciclos de procesamiento para realizar una tarea de iteración de datos determinada que una tarea de nivel inferior (como construir una tabla hash)?