Ваш код довольно выразителен в отношении того, что он должен делать или делать.
Лямбда-выражение - это просто делегат, указывающий на анонимный метод, который является методом с телом, но у него нет имени, с помощью которого он может быть вызван.
Когда мы напишем следующее:
CheckBoxList1.Items.Cast<ListItem>().Where(x => x.Selected)
Компилятор сгенерирует метод наподобие следующего:
internal bool <M>b__0_0(ListItem x)
{
return x.Selected;
}
и тип делегата для хранения ссылки на этот метод:
public static Func<ListItem, bool> <>9__0_0;
и будет вызывать метод для каждого элемента в коллекции.
Мы можем переписать код без использования лямбда-выражения для понимания, например:
public bool IsSelectedWhere(ListItem item)
{
return item.Selected;
}
public object SelectValue(ListItem item)
{
return item.Value;
}
и мыможно вызвать как:
CheckBoxList1.Items.Cast<ListItem>().Where(IsSelectedWhere)
.Select(SelectValue)
.ToList();
Преимущество лямбда-выражения заключается в том, что нам не нужно определять методы в коде, а мы просто пишем их как выражение, а компилятор заботится о генерации метода и его вызове с использованиемFunc<T>
.
Надеюсь, это поможет в некоторой степени.