2009-02-21 13 views

Respuesta

14

Encuentro LINQ to Objects useful all over the place. El problema que resuelve es bastante generales:

  • Usted tiene una colección de algunos elementos de datos
  • ¿Quieres otra colección, formada a partir de la colección original, pero después de algún tipo de transformación o filtrado. Esto podría ser ordenar, proyectar, aplicar un predicado, agrupar, etc.

Esa es una situación que me encuentro bastante a menudo. Hay muchas áreas de programación que básicamente involucran la transformación de una colección (o flujo de datos) en otra. En esos casos, el código que utiliza LINQ es casi siempre más corto y más legible. Me gustaría señalar que LINQ no debe considerarse como sinónimo de expresiones de consulta; si solo se requiere un único operador, the normal "dot notation" (using extension methods) can often be shorter and more readable.

Una de las razones que me gusta especialmente LINQ a objetos es que es tan general - mientras que LINQ to SQL es probable que solamente involucrarse en su capa de datos (o más o menos convertido en la capa de datos), LINQ a Objetos es aplicable en todas las capas y en todo tipo de aplicaciones.

A modo de ejemplo, he aquí una línea en mi marco MINIBENCH la evaluación comparativa, la conversión de un TestSuite (que es básicamente una colección denominada de pruebas) en un ResultSuite (una colección con nombre de resultados):

return new ResultSuite(name, 
    tests.Select(test => test.Run(input, expectedOutput))); 

Entonces de nuevo si un ResultSuite necesidades a ser escalados en contra de algunos en particular "estándar" número:

return new ResultSuite(name, 
    results.Select(x => x.ScaleToStandard(standard, mode))); 

no sería difícil para escribir el código witho ut LINQ, pero LINQ simplemente lo aclara y le permite concentrarse en la "lógica" real en lugar de los detalles de iterar a través de bucles y agregar resultados a listas, etc.

Incluso cuando LINQ no es aplicable, algunas de las características que se incluyeron en gran parte por el bien de LINQ (por ejemplo, las variables locales implícitamente tipadas, expresiones lambda, métodos de extensión) pueden ser muy útiles.

0

LINQ es bastante útil en algunos escenarios:

  • que desea utilizar "entidades de negocios" con tipo, en lugar de tablas de datos, para acceder de forma más natural de sus datos (y aren Ya está usando algo como NHibernate o LLBLGenPro)
  • Desea consultar datos no relacionales utilizando una sintaxis similar a la de SQL (esto es muy útil cuando consulta listas y cosas por el estilo)
  • No le gustan muchos SQL en línea o procedimientos almacenados
+0

Eso es solo LINQ-to-SQL. – MichaelGG

+0

El segundo punto no es - eso sería para consultar listas y tal con LINQ –

0

LINQ viene a jugar cuando comienza a hacer un filtrado complejo en tipos de datos complejos. Por ejemplo, si le dan una lista de objetos People y necesita reunir una lista de todos los doctores dentro de esa lista. Con LINQ, puede comprimir el código siguiente en una sola declaración de LINQ:

(pseudo-código)

doctors = [] 
for person in people: 
    if person is doctor: 
     doctors.append(person) 

(lo siento, mi C# es oxidado, la sintaxis de la verificación de tipos es probablemente incorrecta, pero se obtiene la idea)

doctors = from person in people where person.type() == doctor select person; 
+0

En esa situación no usaría una expresión de consulta - solo haría personas. Donde (persona => persona es Doctor) –

+1

doctores = people.OfType () –

5

La respuesta me viene a la mente en casi todas partes. Una mejor pregunta sería cuando no para usarlo.

+1

OK, haciendo una solicitud HTTP, Multhithreading, así que, ¿se supone que escribimos todo en LINQ? –

+1

Multithreading: Ver PLINQ. –

+0

Hacer una solicitud HTTP es un gran ejemplo. Si incluye la sintaxis lambda como parte de LINQ (y sería extraño que no lo haga), entonces definir sus devoluciones de llamada como cierres lo hace * mucho * más fácil. – MichaelGG

0

Editar: Después de responder, veo un cambio que dice "LINQ to Objects". Oh bien.

Si con LINQ nos referimos a todos los tipos nuevos en System.Linq, así como a las nuevas características del compilador, entonces tendrá un gran beneficio: efectivamente está agregando programación funcional a estos idiomas. (Esta es la progresión que he visto varias veces (aunque esto es principalmente C# - VB es limitado en la versión actual)

El comienzo obvio es que todo lo relacionado con el procesamiento de listas es mucho más fácil. puede simplemente desaparecer. ¿Qué beneficio obtienes? Comenzarás a programar de forma más declarativa, lo que generará menos errores. Las cosas comienzan a "funcionar" al cambiar a este estilo. (La sintaxis de la consulta LINQ tampoco las encuentro). útil, a menos que las consultas sean muy complicadas con muchos valores intermedios. En estos casos, la sintaxis resolverá todos los problemas por los que de otro modo tendrías que pasar tuplas.)

Siguiente, compatibilidad con el idioma (en C# y en la próxima versión de VB) para métodos anónimos te permite escribir muchos más constructos en una gran cantidad de sh camino de orter Por ejemplo, el manejo de una devolución de llamada asíncrona se puede definir dentro del método que lo inicia. El uso de un cierre aquí dará como resultado que no tengas que agrupar el estado en un parámetro de objeto opaco y expulsarlo más adelante.

Ser capaz de utilizar funciones de orden superior te hace pensar de manera mucho más genérica. Entonces comenzarás a ver dónde podrías simplemente pasar un lambda y resolver las cosas más limpias y ordenadas. En este punto, te darás cuenta de que las cosas solo funcionan si usas genéricos. Claro, esta es una función 2.0, pero el uso es mucho más frecuente cuando pasas funciones.

Y por ahí, se llega al punto de rendimientos decrecientes. El costo de declarar y usar los funcs y declarar todos los parámetros de tipo genérico (en C# y VB) es bastante alto. El compilador no lo resolverá, por lo que debe hacerlo todo de forma manual. Esto agrega una gran cantidad de sobrecarga y fricción, lo que limita la distancia que puede recorrer.

Entonces, ¿esto es todo "LINQ"? Depende del marketing, tal vez. El empuje de LINQ hizo que este estilo de programación fuera mucho más fácil en C#, y todo LINQ se basa en las ideas de FP.

5

LINQ es ideal para la "pendiente resbaladiza".Piense en lo que está involucrado en muchas operaciones comunes:

  • Dónde. Simplemente escriba un bucle foreach y un "si"
  • Seleccione. Cree una lista vacía del tipo de destino, recorra los originales, convierta cada uno y agréguelo a los resultados.
  • OrdenBy. Simplemente agréguelo a una lista y llame .Sort(). O implemente una clasificación de burbuja;)
  • ThenBy (a partir del orden por PropertyA, luego por PropertyB). Bastante más difícil. Un comparador personalizado y Sort deberían hacer el truco.
  • GroupBy - crear un Dictionary<key, List<value>> y recorrer todos los elementos. Si no existe una clave, créela, luego agrega elementos a la lista apropiada.

En cada uno de esos casos, el procedimiento requiere más código que el modo LINQ. En el caso de "si" son un par de líneas más; en el caso de GroupBy o OrderBy/ThenBy es mucho más.

Ahora tomemos un escenario muy común de combinarlos juntos. De repente estás mirando un método de 10-20 líneas que podría resolverse con 3-4 líneas en LINQ. Y se garantiza que la versión de LINQ será más fácil de leer (una vez que esté familiarizado con LINQ).

Entonces, ¿cuándo usas LINQ? Mi respuesta: siempre que vea "foreach" :)

Cuestiones relacionadas