Если вы используете синтаксис метода, вы будете видеть функцию довольно часто, например, в Where
, GroupBy
, Join
и т. Д.
Каждый метод с некоторыми входными параметрами и одним возвращаемым значением можетбыть переведены в Func<...>
следующим образом
MyReturnType DoSomething(ParameterType1 p1, ParameterType2, p2) {...}
Func<ParameterType1, ParameterType2, MyReturnType> myFunc = (x, y) => DoSomething(x, y);
Часть Func<ParameterType1, ParameterType2, MyReturnType>
означает: функцию с двумя входными параметрами и одним возвращаемым значением.Входные параметры имеют тип ParameterType1
и ParameterType2
, в этом порядке.Возвращаемое значение имеет значение MyReturnType
.
. Вы создаете экземпляр объекта Func<ParameterType1, ParameterType2, MyReturnType>
, используя лямбда-выражение.Перед =>
вы вводите объявление для входных параметров, после =>
вы вызываете функцию с этими входными параметрами.Если у вас есть более одного входного параметра, вы делаете их запятыми, разделенными скобками.
Для Where
вам нужен Func<TSource, bool>
.Итак, функция, которая имеет в качестве входных данных один элемент источника, и, как результат, bool:
Where(x => x.Name == "John Doe")
Для GroupJoin вам нужен resultSelector типа Func<TOuter,System.Collections.Generic.IEnumerable<TInner>,TResult> resultSelector
Так что это функция св качестве входных данных используется один элемент внешней последовательности и последовательность элементов внутренней последовательности.Например, чтобы запросить учителей с их учениками:
var result = Teachers.GroupJoin(Students,
teacher => teacher.Id, // from every Teacher take the Id,
student => student.TeacherId, // from every Student take the TeacherId,
(teacher, students) => new
{
Id = teacher.Id,
Name = teacher.Name,
Students = students.Select(student => new
{
Id = student.Id,
Name = student.Name,
})
.ToList(),
});
Здесь вы видите несколько функций.TOuter является учителем, TInner является студентом, TKey является int
- OuterKeySelector:
Func<TOuter, TKey>
: teacher => teacher.Id - InnerKeySelector:
Func<TInner, TKey>
: student => student.TeacherId - ResultSelector:
Func<Touter, IEnumerable<TInner>, TResult>
resultSelector - это функция, которая берет один TOuter (Учитель) и последовательность TInner (все ученики этого Учителя) и создает один объектиспользование входных параметров
(teacher, students) => new {... use teacher and students }
При создании лямбда-выражения часто бывает полезно использовать множественное число для ссылки на коллекции (учителя, студенты) и единственные числа, если вы ссылаетесь на один элемент коллекции (студент).
Используйте =>
, чтобы начать определение функции.Вы можете использовать входные параметры, которые были определены до =>
, чтобы определить результат после =>