2009-06-05 14 views
9

Esta es una pregunta acerca de LINQ la característica de lenguaje .NET, no LINQ to SQL.¿Qué tan único es LINQ?

Encuentro que la capacidad de consultar casi cualquier colección de memoria de una manera tan consistente y declarativa es una de las mejores características de lenguaje que he encontrado.

Me resulta extremadamente útil, y me encanta la abstracción limpia que proporciona. LINQ incluso se puede usar para consultar cadenas, de hecho es extremadamente flexible.

Mis preguntas son:

  1. ¿Es esta idea de "lenguaje integrado Consultas" nuevos? y si no, ¿qué otros lenguajes implementan una función similar?
  2. ¿Cómo se comparan otras implementaciones con las de Microsoft?
  3. Esto es un poco subjetivo, pero ¿cuán importante otros sienten que LINQ es una idea?

aplausos

Respuesta

7

resume la idea del lenguaje integerated consulta no es nueva, la forma MS pone es único y nuevo. Se ve afectado por la sintaxis de Haskell y SQL, Haskell tuvo la idea de los enumeradores y la evaluación diferida, que es el principio básico subyacente en la implementación de LINQ, de hecho, LINQ es solo un azúcar sintáctico.

Creo que el enlace es un gran puente entre el razonamiento sobre sus programas y datos de una manera abstracta y limpia.

+0

Sí, de hecho, diría que el azúcar sintáctico está realmente en el núcleo del poder de LINQ – andy

+3

tal vez cristal metastático sintáctico? – geofftnz

3

hablando como la consulta de las colecciones de memoria, no esto no es una característica única. Tome por ejemplo el operador de avance de tubería F #. Le permite escribir operaciones de estilo muy similares a como lo haría con una consulta de linq.

Tomemos por ejemplo el siguiente código que extrae los dígitos de una cadena y les

"foobar42".ToCharArray() 
    |> Seq.filter System.Char.IsDigit 
    |> Seq.map (fun x -> x.ToString()) 
    |> Seq.map System.Int32.Parse 
    |> Seq.sum 
+0

hey Jared, ¿cree que la implementación de F # proporciona la abstracción intuitiva y limpia que LINQ hace? Creo que el poder de LINQ es tanto la implementación como la sintaxis, ¿no? – andy

+3

@andy Creo que la intuición de F # realmente depende de tu fondo. Las primeras veces que recogí F #, encontré que la sintaxis es extremadamente poco intuitiva y difícil de seguir, pero no tengo una base funcional sólida. A los amigos que tienen sólidos antecedentes funcionales les resulta bastante fácil de seguir. Con el tiempo me he acostumbrado y ahora me resulta muy fácil de seguir e intuitivo. – JaredPar

+0

@Jared: excelente punto. Supongo que estoy señalando la forma en que MS creó una sintaxis que se basa libremente en SQL. De hecho, SQL es el lenguaje de consulta final, ese es el único propósito. Para crear la sintaxis que se modela en SQL, parece intuitivo ... – andy

2

Creo que LINQ es muy interesante.

Recuerde que añade esencialmente eficaces funciones de programación funcionales en .NET

También es interesante que Microsoft no tenía que cambiar el tiempo de ejecución para hacer que el trabajo de LINQ, toda la magia es debido a las nuevas características del lenguaje en C# 3 y en el compilador y en la biblioteca de clases, porque esencialmente sus consultas se traducen internamente a la sintaxis lambda (consulte LINQPad para ver una buena demostración de esto)

Creo que una de las razones por las que MS desarrolló este tipo de tecnología es para facilitar programas de paralelización: SQL puede ser menos relevante debido a LINQ.

+1

@dplante: no omita el último paso que hace que LINQ funcione. Árboles de expresión. Quizás otros compiladores modernos puedan analizar una expresión y guardar el árbol de expresiones en una estructura accesible en tiempo de ejecución, pero LINQ sí lo hace. Permite al proveedor de LINQ interpretar el árbol de expresiones para producir todo lo que el almacén de datos subyacente requiere para cumplir con la intención del desarrollador. –

2

Dentro de Microsoft, se desarrolló una sintaxis muy similar en C-omega (Cw) antes de ser adoptada por C# y VB.

2

Los conceptos en Linq (Where, Select, Aggregate) han estado en LISP para años ahora, estos no son nada nuevos.Sin embargo, la implementación en C# es particularmente elegante, especialmente cómo logra agregar un concepto bastante perturbador pero se combina tan bien con el código C# 2.0 existente. El "reinterpretar Linq AST como SQL" también es bastante inteligente.

+0

hmm, gracias Paul. Sí, realmente diría que es la elegancia de la implementación de MS lo que lo hace tan útil ... – andy

2

Linq tiene mucho que ver con List comprehensions que puede encontrar en lenguajes funcionales y en otros idiomas como Python, donde ha sido una característica estándar y ampliamente utilizada desde hace bastante tiempo.

Para una buena exemple de listas por comprensión, esta función Python tomada de la simple spell checker por Peter Norvig

def edits1(word): 
    s = [(word[:i], word[i:]) for i in range(len(word) + 1)] 
    deletes = [a + b[1:] for a, b in s if b] 
    transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1] 
    replaces = [a + c + b[1:] for a, b in s for c in alphabet if b] 
    inserts = [a + c + b  for a, b in s for c in alphabet] 
    return set(deletes + transposes + replaces + inserts) 

Se parece mucho a LINQ, con la (implícita) seleccione por escrito al comienzo de la expresión, en lugar de estar extrañamente al final como en Linq.

Las lambdas son algo desaprovechadas en Python, y la lista predeterminada de Python es entusiasta (piensa List<T>) en lugar de floja (IEnumerable<T>) pero está muy cerca.

En cuanto al concepto de tener (un poco) el encadenamiento de la pura función, al igual que otras personas han respondido aquí, es uno de los concepto más antiguo de los lenguajes de programación (Lisp ser mayores de 50 años ahora ...)

+0

¡Guau, ese código para el corrector ortográfico es realmente, muy bueno! – Casebash

2

¿Es esta idea de "Consultas integradas de idioma" nuevo? y si no, qué otros lenguajes implementan una característica similar

Si considera que sql es un idioma, entonces no. Creo que la intuición de MS fue que todo en una matriz como contenedor es esencialmente una base de datos en memoria. No solo eso, sino que muchas de las operaciones sobre estas colecciones son las mismas. Los programadores deben escribir millones de .selects, .wheres, y .firsts en el transcurso de un año. Muchas de estas implementaciones tienen matrices temporales y variables que desordenan el código. Con LINQ, la lógica se hace mucho más conciso, sin la variable/matriz variable/matrices. MS eliminó una clase completa de errores con los operadores LINQ estándar.

¿Cómo se comparan otras implementaciones con las de Microsoft? No estoy seguro

Esto es un poco subjetivo, pero ¿qué tan importante otros sienten LINQ, como una idea, es?

Creo que LINQ es posiblemente la característica de lenguaje más revolucionaria que he visto en mi vida, y pensé que los cierres también eran geniales. Hace que los programas sean más limpios y los programadores mucho más productivos.

+0

gracias Steve, excelente articulación de lo que LINQ ha logrado y ha hecho posible – andy