Сколько там к LINQ?

Во-первых, найдите этот атрибут наверху своего файла App.xaml и удалите его:

StartupUri="Window1.xaml"

, Который означает, что приложение автоматически не инстанцирует Вашего главного окна и покажет его.

Затем, переопределяют метод OnStartup в Вашем классе Приложения для выполнения логики:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    if ( /* test command-line params */ )
    {
        /* do stuff without a GUI */
    }
    else
    {
        new Window1().ShowDialog();
    }
    this.Shutdown();
}
10
задан Joe 13 September 2009 в 17:00
поделиться

5 ответов

Функционально, LINQ - не что иное, как синтаксический упрощение выражения монад. Linq to Objects (понимание списков - даже это уже было бы чрезвычайно полезно), о котором вы говорили, является лишь одним возможным применением этого (аналогично List-Monad в Haskell).

Если вы напишете

from x in expr1
from y in expr2
select x + y

, это будет не что иное, как

do
    x <- expr1
    y <- expr2
    return $ x + y

в Haskell.

Конкретные действия зависят от определенных пользователем Linq-провайдеров (методов расширения), из которых Linq.Enumerable - это всего лишь одна реализация, включающая IEnumerable s.

Предоставляя один, вы можете создать совершенно новую LINQ-семантику для ваших типов.

Пример: учитывая тип Option для вычислений, которые могут завершиться ошибкой (значения, допускающие значение NULL), можно определить Linq-провайдер для выполнения запросов к ним.

public static class MaybeExtensions
{
public static Option<T> ToMaybe<T>(this T value)
{
    return Option<T>.Some(value);
}

public static Option<U> SelectMany<T, U>(
    this Option<T> m, 
    Func<T, Option<U>> k)
{
    return !m.IsNone ? Option<U>.None : k(m.Value);
}

public static Option<V> SelectMany<T, U, V>(
    this Option<T> m, 
    Func<T, Option<U>> k, 
    Func<T, U, V> s)
{
    return m.SelectMany(x => k(x).SelectMany(y => s(x, y).ToMaybe()));
}
} 

Теперь это позволит нам написать такой код:

var sum = from x in ReadNumber("x")
          from y in ReadNumber("y")
          select x + y; 

Вычисление будет возвращать значение только в том случае, если все вычисления завершились успешно, и в противном случае потерпит неудачу при первом сбое.

В комбинация с деревьями выражений,Linq может быть чрезвычайно мощным и позволяет вам выражать -

  1. Доступ к базе данных
  2. Асинхронный поток программы
  3. Maybe-Monads
  4. Списки понимания
  5. Рекурсивные анализаторы спуска
  6. Продолжения
  7. Мини-языки
  8. Параллельные вычисления (PLinq)

Некоторые ссылки:

В сочетании с комбинаторами с фиксированной точкой Linq предоставляет полный функциональный мини-язык ( Linq raytracer ).

Обратите внимание, что Scala и F # имеют схожие концепции в выражениях для понимания и вычислений. монадические абстракции:

Scala:

for (x <- expr1
     y <- expr2) yield x + y

F #:

monad {
    let! x = expr1
    let! y = expr2
    return x + y
}
25
ответ дан 3 December 2019 в 13:56
поделиться

Одышка, вероятно, предназначена для всех этих "очевидных" вещей, некоторые из которых (например, деревья выражений) действительно превосходны. Язык - это просто средство доступа; Вас волнует ключевое слово throw или его функциональность?

5
ответ дан 3 December 2019 в 13:56
поделиться

Кроме того, читая книгу об этом, вы уже использовали LINQ? Я обнаружил, что это значительно экономит время в моей повседневной работе над программированием. Для меня это следующий шаг абстракции, который можно использовать для объединения различных источников данных, таких как XML или SQL, и работы с ними на одном «языке».

Кроме того,

4
ответ дан 3 December 2019 в 13:56
поделиться

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

var qry = from x in src
          where x.Foo == "foo"
          select x.Bar;

буквально :

var qry = src.Where(x => x.Foo == "foo").Select(x => x.Bar);

Он ничего не знает о методах расширения (хотя они являются наиболее распространенными (но не только ) реализация), и ничего о Expression и т. д. Количество ключевых слов (и, следовательно, количество требуемых реализаций методов) невелико. Джон однажды попытался реализовать их все за 1 час (в живой презентации). Он не так уж плохо справился ;-p


Возможно, более впечатляющей частью LINQ является поддержка дерева выражений , которая требовалась для использования LINQ в базах данных, т.е. лямбда-выражение, которое может быть скомпилировано либо в делегат , либо в объектную модель, представляющую написанный код. Интересно, что эта же идея проявляется и в том, как разрешение DLR работает в 4.0.

3
ответ дан 3 December 2019 в 13:56
поделиться

LINQ был вдохновлен HaskellDB, как неоднократно заявлял Эрик Мейер , например, в Признания продавца используемых языков программирования (Привлечение масс к Haskell) , поэтому сама по себе это не новая концепция. Использование одного и того же языка для запросов к разным источникам в некоторой степени является новаторским, хотя тот факт, что вложенная реляционная модель охватывает XML, объекты и реляционные базы данных, уже был продемонстрирован исследователями ранее. Для меня очень круто то, что он был встроен в популярный, универсальный и в первую очередь объектно-ориентированный язык, чего раньше не было.

ИМХО, Scala может включать нечто подобное. Пока что для Scala у нас есть ScalaQuery Стефана Зейгера и Daniel Spiewak »

2
ответ дан 3 December 2019 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: