Первая часть имеет смысл, но это часть в скобках, которую я не понимаю.
Здесь вы видите лямбда-выражение . Это особенный анонимный делегат.
Это в основном LINQ?
Enumerable.SingleOrDefault
- это метод LINQ, но лямбда-выражения не зависят от LINQ; они просто делают LINQ невероятно дружелюбнее, чем могло бы быть.
Теперь для получения конкретного IEnumerable<Subject>.SingleOrDefault(s => s.ID == ID)
возвращает уникальный экземпляр Subject
в IEnumerable<Subject>
, который соответствует предикату s => s.ID == ID
, или возвращает null
, если такого экземпляра нет. Выдает исключение, если существует более одного такого экземпляра. Во время компиляции s => s.ID == ID
преобразуется в полноценный делегат, который ест объекты типа Subject
и возвращает bool
, то есть true
, если и только если 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);
Приятно то, что компилятор просто автоматически выплевывает это для вас, когда вы используете лямбда-выражение.