2009-06-05 3 views
9

Questa è una domanda su LINQ la funzionalità del linguaggio .NET, non LINQ to SQL.Quanto è unico LINQ?

Trovo che la possibilità di interrogare quasi tutte le raccolte di memorie in modo così coerente e dichiarativo sia una delle migliori funzionalità linguistiche che abbia mai incontrato.

Lo trovo estremamente utile, e adoro l'astrazione pulita che fornisce. LINQ può anche essere usato per interrogare le stringhe, anzi è estremamente flessibile.

Le mie domande sono:

  1. È questa idea di "Lingua query integrati" nuovi? e in caso contrario, quali altre lingue implementano una funzione simile
  2. In che modo le altre implementazioni sono paragonabili a quelle di Microsoft?
  3. Questo è un po 'soggettivo, ma quanto gli altri pensano che LINQ, come idea, sia?

applausi

risposta

7

L'idea del linguaggio integerated query non è nuovo, il modo in cui MS pone è unico e nuovo. È influenzato dalla sintassi Haskell e SQL, Haskell ha avuto l'idea di enumeratori e di valutazione lazy, che è il principio di base fondamentale nell'implementazione di LINQ, infatti LINQ è solo uno zucchero sintattico.

Ritengo che il collegamento sia un ottimo ponte tra il ragionamento sui programmi e i dati in modo astratto e pulito.

+0

sì, in realtà direi che lo zucchero sintattico è davvero al centro del potere di LINQ – andy

+3

forse meth di cristallo sintattico? – geofftnz

3

Parlando come interrogazione di collezioni in memoria, senza questa non è una caratteristica unica. Prendiamo ad esempio l'operatore pipe forward di F #. Ti permette di scrivere operazioni di stile molto simili come faresti con una query di linq.

Prendete per esempio il seguente codice che estrae le cifre da una stringa e riassume le

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

hey Jared, pensi che l'implementazione di F # fornisca l'astrazione intuitiva e pulita di LINQ? Penso che il potere di LINQ sia l'implementazione e la sintassi no? – andy

+3

@andy Penso che l'intuitività di F # dipenda in realtà dal tuo background. Le prime volte che ho ascoltato F # ho trovato la sintassi estremamente non intuitiva e difficile da seguire, ma non ho un forte background funzionale. I miei amici che hanno un background funzionale forte lo hanno trovato piuttosto facile da seguire. Nel corso del tempo mi sono abituato e ora lo trovo molto facile da seguire e intuitivo. – JaredPar

+0

@ Jared: punto eccellente. Credo che sto indicando il modo in cui MS ha creato una sintassi che è liberamente basata su SQL. In effetti, SQL è una specie di linguaggio di query di ultima generazione, che è l'unico scopo. Creare una sintassi che si modella su SQL lo rende intuitivo ...? – andy

2

Penso che LINQ sia molto interessante.

Ricordate che aggiunge, in sostanza potenti funzionalità di programmazione funzionali in .NET

E 'anche interessante il fatto che Microsoft non ha dovuto cambiare il runtime per rendere il lavoro LINQ, tutta la magia è a causa di nuove funzionalità del linguaggio in C# 3 e nel compilatore e nella libreria di classi - perché essenzialmente le tue query vengono tradotte internamente in sintassi lambda (vedi LINQPad per buone dimostrazioni di questo)

Credo che uno dei motivi per cui MS ha sviluppato questo tipo di tecnologia è rendere più facile parallelizzare i programmi - SQL potrebbe diventare meno rilevante a causa di LINQ.

+1

@dplante: non tralasciare l'ultimo passaggio che fa funzionare LINQ. Alberi espressione Forse altri compilatori moderni possono analizzare un'espressione e salvare l'albero delle espressioni in una struttura accessibile al runtime, ma LINQ lo fa. Consente al provider LINQ di interpretare l'albero delle espressioni per produrre tutto ciò che l'archivio dati sottostante richiede per soddisfare l'intento dello sviluppatore. –

2

In Microsoft, una sintassi molto simile è stata sviluppata in C-omega (Cw) prima di essere adottata da C# e VB.

2

I concetti in Linq (Where, Select, Aggregate) sono stati in LISP per anni ora, questi non sono affatto nuovi.L'implementazione in C# è particolarmente elegante, soprattutto in quanto riesce ad aggiungere un concetto piuttosto distruttivo, ma si fonde perfettamente con il codice C# 2.0 esistente. Il "reinterpretare Linq AST come SQL" è anche abbastanza dannatamente ingegnoso.

+0

hmm, grazie Paolo. Sì, direi davvero l'eleganza dell'implementazione di MS che lo rende così utile ..? – andy

2

Linq ha molto a che fare con List comprehensions si può trovare in linguaggi funzionali e nelle lingue più tradizionali come Python, dove è stato un livello e molto ampiamente caratteristica usato per un bel po 'di tempo.

Per un buon esempio di list comprehension, questa funzione Python tratto dal simple spell checker da 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) 

sembra un po 'come LINQ, con la (implicita) selezionare scritto all'inizio dell'espressione, invece di essere stranamente alla fine come in Linq.

lambdas sono in qualche modo disapprovazione in Python e le comprensioni di elenco predefinite in Python sono ansiose (si consideri List<T>) anziché pigro (IEnumerable<T>) ma è molto vicino.

Per quanto riguarda il concetto di avere (un po ') la funzione pura concatenamento, come le altre persone hanno risposto qui, è uno dei concetti più antichi linguaggi di programmazione (essere Lisp oltre 50 ora ...)

+0

Wow, quel codice per il correttore ortografico è davvero molto bello! – Casebash

2

questa idea di "Language Integrated Queries" nuovo? e se no, quali altre lingue implementano una funzione simile

Se si considera sql una lingua, allora no. Penso che l'intuizione di MS fosse che tutto in un array come un contenitore è essenzialmente un database in memoria. Non solo, ma molte delle operazioni su queste raccolte sono le stesse. I programmatori devono scrivere milioni di .select, .wheres e .firsts nel corso di un anno. Molte di queste implementazioni hanno array temporanei e modificano il codice di clutter. Con LINQ, la logica è resa molto più concisa, senza la variabile/array di temp/holder. MS ha spazzato via un'intera classe di bug con gli operatori LINQ standard.

In che modo le altre implementazioni sono paragonabili a quelle di Microsoft? Non sicuro

Questo è un po 'soggettivo, ma quanto sono importanti gli altri pensano LINQ, come idea, è?

Ritengo che LINQ sia probabilmente la funzione di linguaggio più rivoluzionaria che abbia mai visto e ho pensato che anche le chiusure fossero fantastiche. Rende i programmi più puliti e i programmatori molto più produttivi.

+0

ringrazia Steve, eccellente articolazione di ciò che LINQ ha realizzato e reso possibile – andy