2009-06-05 6 views
9

Это вопрос о LINQ .NET языке, не LINQ to SQL.Насколько уникален LINQ?

Я нахожу, что способность запрашивать почти любую память в такой последовательной и декларативной форме - одна из лучших языковых функций, с которыми я когда-либо сталкивался.

Я нахожу его чрезвычайно полезным, и я люблю чистую абстракцию, которую он предоставляет. LINQ можно даже использовать для запросов Strings, и в самом деле он чрезвычайно гибкий.

Мои вопросы:

  1. Является ли эта идея "Language Integrated запросов" новые? и если нет, то какие другие языки реализуют аналогичную функцию.
  2. Как другие реализации сравниваются с Microsoft?
  3. Это немного субъективно, но как важно, чтобы другие чувствовали LINQ, как идея?

веселит

ответ

7

Идея языка integerated запроса не нова, как MS помещает это является уникальным и новым. На это влияет синтаксис Haskell и SQL, у Haskell была идея перечислений и ленивая оценка, которая является основным принципом подчеркивания при реализации LINQ, на самом деле LINQ - это просто синтаксический сахар.

Я чувствую, что ссылка - отличный мост между рассуждениями о ваших программах и данными абстрактным и чистым способом.

+0

Да, на самом деле я бы сказал, что синтаксический сахар действительно лежит в основе силы LINQ – andy

+3

может быть, синтаксический кристалл meth? – geofftnz

3

Говорящих как запросы к памяти в коллекциях, нет это не уникальная особенность. Возьмем, к примеру, оператор прямой линии F #. Он позволяет писать очень похожие операции стиля, как и запрос linq.

Возьмем, например, следующий код, который извлекает цифры из строки и суммирует их

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

эй, Джаред, чувствуете ли вы, что реализация F # обеспечивает интуитивную и чистую абстракцию, которую делает LINQ? Я думаю, что сила LINQ - это и реализация, и синтаксис нет? – andy

+3

@andy Я думаю, что интуитивность F # действительно зависит от вашего фона. Первые несколько раз, когда я взял F #, я нашел синтаксис крайне неинтуитивным и трудно следовать, но у меня нет сильного функционального фона. У моих друзей, у которых есть сильные функциональные фоны, было довольно легко следовать. Со временем я привык к этому, и теперь мне очень легко следовать и интуитивно понятно. – JaredPar

+0

@ Jared: отличная точка. Наверное, я указываю, как MS создала синтаксис, который свободно основан на SQL. Действительно, SQL - это своего рода конечный язык запросов, это единственная цель. Чтобы создать синтаксис, который моделирует себя на SQL, он кажется интуитивным ...? – andy

2

Я думаю, что LINQ очень интересен.

Помните, что это существенно добавляет мощные функциональные возможности программирования в .NET

Также интересно, что Microsoft не нужно изменить среду выполнения, чтобы сделать LINQ работу, все волшебство из-за новых возможностей языка в C# 3 и в компиляторе и в библиотеке классов - потому что по существу ваши запросы внутренне переводится в лямбда-синтаксис (см. LINQPad для хороших демонстраций)

Я считаю, что одна из причин, по которой MS разработала такую ​​технологию, - это упростить параллелизировать программы - SQL может стать менее актуальным из-за LINQ.

+1

@dplante: не оставляйте последний шаг, делающий работу LINQ. Деревья выражений. Возможно, другие современные компиляторы могут анализировать выражение и сохранять дерево выражений в структуре, доступной во время выполнения, но LINQ. Он позволяет провайдеру LINQ интерпретировать дерево выражений для создания того, что требует базовое хранилище данных, чтобы соответствовать намерению разработчика. –

2

В Microsoft в C-omega (Cw) был разработан очень похожий синтаксис, прежде чем он был принят C# и VB.

2

Концепции в Linq (Where, Select, Aggregate) были в LISP за годами сейчас, это совсем не ново.Реализация на C# особенно элегантна, особенно, когда ей удается добавить довольно разрушительную концепцию, но так хорошо сочетается с существующим кодом C# 2.0. «Реинтерпрет Linq AST как SQL» тоже довольно хитроумный.

+0

Хмм, спасибо Пол. Да, я бы действительно сказал, что это элегантность внедрения MS, которая делает его настолько полезным ..? – andy

2

Linq имеет много общего с List comprehensions, вы можете найти на функциональных языках и в более популярных языках, таких как Python, где уже довольно давно используется стандартная и очень широко используемая функция.

Для хорошего Exemple из списковых, эта функция Python взято из simple spell checker Питером Норвиг

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) 

Это выглядит как Linq, с (неявным) выберите написанные в начале выражения, вместо того, чтобы быть странным в конце, как в Линке.

lambdas несколько нахмурился в Python, и по умолчанию списки в Python нетерпеливы (думаю, List<T>) вместо ленивого (IEnumerable<T>), но это очень близко.

Что касается концепции, имеющий (несколько) чистую функцию цепочки, как и другие люди ответили здесь, это один из самых старых в концепции языков программирования (Lisp существа более 50 сейчас ...)

+0

Вау, этот код для проверки орфографии действительно, очень хороший! – Casebash

2

Является ли эта идея из «языковых интегрированных запросов»? а если нет, то какие другие языки реализуют аналогичную функцию.

Если вы считаете sql язык, то нет. Я думаю, что понимание MS состояло в том, что все в массиве, подобном контейнеру, по существу является базой данных в памяти. Не только это, но и многие операции над этими коллекциями одинаковы. Программисты должны писать миллионы .selects, .wheres и .firsts в течение года. Многие из этих реализаций имеют временные массивы и изменяют этот код помех. С LINQ логика делается гораздо более сжатой, без переменной/массива temp/holder. MS уничтожила целый класс ошибок со стандартными операторами LINQ.

Как другие реализации сравниваются с Microsoft? Не уверен

Это немного субъективно, но как важно, чтобы другие чувствовали LINQ, как идея?

Я чувствую, что LINQ - это, пожалуй, самая революционная языковая функция, которую я когда-либо видел, и я думал, что закрытие также было довольно удивительным. Это делает программы более чистыми, а программисты намного более продуктивными.

+0

благодарит Стив, отличная артикуляция того, что LINQ достигла и сделала возможным – andy

Смежные вопросы