¿Para qué problema se creó LINQ?

12

Cada vez que veo una pregunta publicada en Stack Overflow en C #, veo al menos una o dos respuestas publicadas que resuelven un problema con LINQ. Por lo general, las personas con una reputación muy alta parecen usar LINQ como profesionales.

Entonces, mi pregunta es, ¿para qué dominio del problema se debe usar LINQ?

También en notas laterales: ¿Hay algún propósito para evitarlo? ¿El tamaño del conjunto de datos afecta el rendimiento de las consultas LINQ?

    
pregunta user1816120 05.02.2013 - 13:59

3 respuestas

16

LINQ está diseñado principalmente para permitir consultas puramente funcionales y transformaciones en secuencias de datos (notará que todas las extensiones de LINQ toman delegados funcionales pero no delegados de acción). En consecuencia, el caso más común de un bucle que no encaja muy bien con LINQ es uno que trata de efectos secundarios funcionales no puros, por ejemplo.

foreach(var x in list) Console.WriteLine(x);

Para mejorar el uso de LINQ, solo practica su uso.

Cada vez que esté a punto de escribir un bucle for o foreach para hacer algo con una colección, deténgase, considere si es una buena opción para LINQ (es decir, no es solo realizar una acción / efecto secundario en los elementos) ), y si es así, obligate a escribirlo usando LINQ.

También puedes escribir primero la versión foreach y luego volver a escribir en una versión LINQ.

Como señala svick, LINQ debe tratar de hacer que su programa sea más legible. Por lo general, esto es bueno, ya que tiende a enfatizar la intención del código en lugar del mecanismo; Sin embargo, si descubre que no puede hacer que sus consultas sean más legibles que un simple bucle, no dude en seguir con el bucle.

Si necesita ejercicios para practicar, la mayoría de los ejercicios de programación funcional se asignarán muy bien a LINQ, por ejemplo. 99 problemas (especialmente los primeros 20) o project euler .

    
respondido por el jk. 05.02.2013 - 14:16
1

Para responder a la pregunta editada: en resumen, es beneficioso usar LINQ siempre que tenga que implementar la funcionalidad de "consulta" (eso es lo que significa la Q en LINQ). Definir un dominio exacto es difícil, pero simplifica en gran medida una variedad de tareas asociadas con la extracción y manipulación de datos de colecciones.

Para elaborar un poco, se ha incorporado una gran cantidad de funciones de consulta directamente al lenguaje (o, más bien, a los diversos implementadores de LINQ), por lo que se incluyen agregaciones, ordenación, agrupación, filtrado, proyecciones, uniones (y muchas más). todo manejado por usted. Las soluciones basadas en LINQ también suelen ser mucho más cortas que si las implementara "a mano", y también comunicaran su intención mucho mejor.

Un ejemplo simple que a menudo ayuda a transmitir el poder de LINQ es mostrar los contenidos de un directorio, agrupados por extensión. Repase una implementación imperativa típica en su cabeza: habrá muchos detalles de implementación ya desde el principio. Quizás usaremos un Dictionary<String, List<String>> para indexar los archivos por extensión. Por supuesto, tendremos que verificar si ya existe una clave, crear una instancia de una lista, agregarla, etc. Podría ser algo como:

Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();

foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
    string extension = Path.GetExtension(file).ToLower();

    if (!fileGroups.ContainsKey(extension))
    {
        fileGroups[extension] = new List<string>();
    }

    fileGroups[extension].Add(file);
}

Considere el equivalente de LINQ:

var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
            group file by Path.GetExtension(file).ToLower();

Observe que la consulta en sí es solo de 2 líneas, ciertamente más corta que cualquier solución imperativa que pudiéramos haber encontrado. También es bastante legible; la relación señal / ruido es más alta que con la primera solución. Para aquellos que son nuevos en LINQ, obtendrías los resultados de esa consulta de la siguiente manera:

foreach (var fileGroup in query)
{
    Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));

    foreach (string file in fileGroup)
    {
        Console.WriteLine(file);
    }
}

Con ejemplos más complejos, las diferencias normalmente se vuelven aún más vastas (considere agrupar por campos múltiples, por ejemplo). Entonces, para resumir, LINQ resuelve muchos problemas de consulta de datos "del día a día" de una manera que a menudo es más breve y más autodescriptiva. Esto tiene un costo moderado de tener que aprender la sintaxis y la tecnología, pero los beneficios superan con creces los aspectos negativos.

    
respondido por el Daniel B 06.02.2013 - 15:47
0

Se han desarrollado diferentes idiomas a lo largo del tiempo para los distintos tipos de fuentes de datos, por ejemplo, SQL para bases de datos relacionales y XQuery para XML. Por lo tanto, los desarrolladores han tenido que aprender un nuevo lenguaje de consulta para cada tipo de fuente de datos o formato de datos que deben admitir. LINQ simplifica esta situación al ofrecer un modelo consistente para trabajar con datos en varios tipos de fuentes y formatos de datos. En una consulta LINQ, siempre está trabajando con objetos. Para obtener más información, visite enlace

    
respondido por el Rabbil 05.03.2013 - 06:54

Lea otras preguntas en las etiquetas

Comentarios Recientes

Hay momentos en que simplemente no puedes. Por ejemplo, modelando desarrolladores, ayudando con sistemas complejos de relaciones públicas, o usando procesamiento de lenguaje natural para administrar datos complejos de clientes. Para hacer esto, debe comprender dominios con problemas complejos como interfaces de usuario, enlaces de datos, chatbots, la sintaxis de Python OOP, diferentes dialectos de idiomas, etc. LINQ solo admite un pequeño conjunto de dominios problemáticos. Necesita lenguajes de programación especializados... Lee mas