Как это Выражение LINQ работает?

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

return db.Subjects.SingleOrDefault(s => s.ID == ID);

Первая часть имеет смысл, но это - часть в скобках, которые я не понимаю. Как мы можем использовать s не объявляя это? И как мы помещаем логику в вызов метода?

5
задан George Stocker 21 January 2010 в 03:13
поделиться

6 ответов

Первая часть имеет смысл, но это часть в скобках, которых я не понимаю.

Что вы видите здесь, - это выражение лямбда . Это очень особенный анонимный делегат.

Это в основном в основном Linq?

перечисление. Singleordefault - это метод LINQ, но лямбдас - это нечто зависимо от Linq; Они просто делают LINQ невероятно более дружелюбнее, чем в противном случае он был бы.

Теперь, чтобы получить конкретные IENumerable .singleordefault (s => s in == id) Возвращает уникальный экземпляр субъекта в IENumerable < Тема> , который соответствует предикату S => S.ID == ID или он возвращает NULL , если нет такого экземпляра. Это бросает исключение, если есть более одного такого экземпляра. При компиляционном времени S => S.ID == ID переводится в полноценный делегат Eats объекты типа объекта и возвращает bool , что True If, если и только тогда, когда S.ID равно ID .

Как мы можем использовать S , не объявляя его?

=> - это лямбда . Он в основном отделяет левую часть лямбда выражения с правой стороны. Левая сторона - это входные переменные. Это эквивалентно списку параметров в явно определенном методе. То есть S в лямбдейском выражении играет роль s ниже:

public bool Predicate(Subject s)

Это просто то, что вам не нужно объявлять тип S как Компилятор будет выводит это.

правая сторона лямбда тела. Это эквивалентно телу ниже

public bool Predicate(Subject s) {
    return s.ID == ID;
}

, что еще больше, вам не нужно объявлять тип возврата; Компилятор будет выводит это.

Итак, в конце концов, как будто вы сделали следующее:

class MyPredicate {
    public string ID;
    public bool Predicate(Subject s) {
        return s.ID == this.ID;
    }
}

, то:

// elements is IEnumerable<Subject>
// ID is string
MyPredicate predicate = new MyPredicate();
predicate.ID = ID;
elements.SingleOrDefault(predicate.Predicate);

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

16
ответ дан 18 December 2019 в 05:43
поделиться

S до => объявляет переменную с типом элемента структуры (тип, содержащийся в переменной субъекты редактирование: другие функции работают с большим количеством аргументов, то есть. Присоединяйтесь к ) Правая часть (после =>). Логика исходит от функции. Если вы позвоните в TontyOdefault (поиск в документах), он вернет один элемент, если удовлетворяют условию или нулю. В Linq есть много функций, которые вы можете использовать (т. Е. Сначала (), где (), ...). Надеюсь, это поможет.

0
ответ дан 18 December 2019 в 05:43
поделиться

Я думаю, что ваша путаница лежит вокруг выражения S => S.ID == ID . Это лямбда выражение. Это простые термины Это способ определения встроенной функции.

В этом случае текст на левую сторону => - список аргументов. Так что S объявлен в силу в этом положении. Правая сторона => - это выполненное выражение. В этом конкретном контексте лямбда будет работать на каждом элементе в коллекции, и код будет утверждать, что есть одно значение, которое соответствует выражению, выполненному лямбду.

4
ответ дан 18 December 2019 в 05:43
поделиться

Это называется лямбда выражением. Смотрите здесь для объяснения. лямбда выражения (C # Руководство по программированию)

5
ответ дан 18 December 2019 в 05:43
поделиться

На сайте ниже я нашел несколько возможных решений.

http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/e9c5da47-a194-4051-a3d5-28b404263b3f

Наилучшим способом было запустить Internet Explorer Затем перейдите на вкладку Сервис - > Свойства обозревателя - > Дополнительно - > раздел Безопасность, снимите флажок «Проверка отзыва сертификата издателя»

-121--4409613-

Попробуйте в приложении получить часовой пояс по умолчанию или установите часовой пояс вручную (строка с комментариями).

Небольшой мой пример:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Locale locale = Locale.getDefault();
        TimeZone localTimeZone = TimeZone.getDefault(); 
        //TimeZone localTimeZone = TimeZone.getTimeZone("Australia/Sydney");
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale);
        dateFormat.setTimeZone(localTimeZone);
        Date rightNow = new Date();
        System.out.println(locale.toString() + ": " + dateFormat.format(rightNow));
    }
}
-121--2913825-

Это компилятор C # 3.0, работающий над магией для вас.

Эта инструкция компилируется в делегат и эквивалентна:

return db.Subjects.SingleOrDefault(delegate(s) { return s.ID == ID }); 

Она называется лямбда-выражением, так как нет необходимости формально объявлять параметры, они выводятся компилятором C #.

5
ответ дан 18 December 2019 в 05:43
поделиться

Это лямбда лямбда .

0
ответ дан 18 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

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