Как я могу перевести функции лямбда-оператора в этом примере C #? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь понять этот блок кода:

List<string> selectedValues = CheckBoxList1.Items.Cast<ListItem>()
    .Where(li => li.Selected)
    .Select(li => li.Value)
    .ToList();

Из моего исследования я понимаю смысл функции Lambda (чтобы предоставить функцию, которую можно использовать в качестве встроенного параметра), нопочему в этом случае он используется?

Чтобы добавить в selectedValues ​​только элементы li.Selected и добавить только значение этих выбранных элементов в список selectedValues?Если это так, то нет ли другого более читабельного способа сделать это?Как еще это можно написать?Правильно ли мое понимание?

Спасибо за ваше время.

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Ваш код довольно выразителен в отношении того, что он должен делать или делать.

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

Когда мы напишем следующее:

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>.

Надеюсь, это поможет в некоторой степени.

0 голосов
/ 30 января 2019

Блок кода в вопросах выполняет следующие действия:

  1. Получить все предметы в CheckBox1.Items
  2. Приведите их к типу ListItem
  3. Фильтр только для выбранных элементов
  4. Выберите значение для тех элементов, которые теперь отфильтрованы.
  5. Приведите результат к списку.

Вы также можетенапишите код следующим образом:

List<string> selectedValues = new List<string>();
foreach (object item in CheckBoxList1.Items) {
    var listItem = (ListItem)item;
    if (listItem.Selected) {
       selectedValues.Add(listItem.Value);
    }
 }
0 голосов
/ 30 января 2019

Вы правильно прочитали лямбду.Лямбда легче получить, если вы думаете об этом как о пошаговом исполнении.Для меня они более читабельны, и все они последовательны.Они следуют одной и той же структуре, в то время как есть много способов написать одно и то же, лямбда для этого примера всегда будет одинаковой.

Другой способ написать это (обратите внимание, что здесь я кодирую все лямбдана самом деле проверяет):

List<string> selectedValues = new List<string>();

for(int i = 0; i < CheckBoxList1.Items.Count(); i++)
{
    ListItem item = CheckBoxList1.Items[i] as ListItem;

    if(item != null)
    {
        if(item.Selected == true)
        {
            selectedValues.Add(item.Value);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...