Используйте Func в Ilist, почему лямбда-выражение? - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть IList типа клиента. Мне нужно было бы пройти через это и вернуть элемент, который соответствует некоторому условию. Я хотел использовать «умнее», чем foreach, поэтому я попробовал метод Single, однако я не уверен, почему это работает, и если это можно сделать другим способом (я не настолько продвинут):

private client GetClientByID(short ID)
{
   return this.ListOfClient.Single(c => c.ID == ID);
}

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

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Ваш код правильный, это лямбда-выражение в основном является методом, который возвращает bool (в данном конкретном случае). Итак, представьте, что для каждого элемента в вашем ListOfClient он попытается выполнить этот метод, если он вернет true, то он вернет элемент.

Вам нужно быть осторожным, чтобы при использовании Single не получилось, если в вашем Списке 0 или более совпадений.

Если вы уверены, что будет только 1 предмет, тогда это нормально, если нет, вы можете воспользоваться одним из следующих:

  • List.SingleOrDefault() //returns null if there are 0 items, fails if there are more than 1
  • List.First() //fails if there are 0 items
  • List.FirstOrDefault() //never fails, returns null if there are 0 items
0 голосов
/ 15 декабря 2011

С MSDN

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

Это означает, что ваш код эквивалентен

private client GetClientByID(short ID)
{
   return this.ListOfClient.Single(delegate(Client c) { return c.ID == ID; });
}

Single - это метод расширения linq, который можно определить как Enumerable.Single Method (IEnumerable, Func) Обратите внимание на второй параметр

Func<TSource, bool> predicate

Из другой статьи MSDN

Предикатный делегат. Представляет метод, который определяет набор критериев и определяет, соответствует ли указанный объект этим критериям .

Это означает, что он будет проверять критерии return c.ID == ID; для каждого элемента коллекции и возвращает тот, который отвечает требованиям.

PS Будьте осторожны с Single методом. Я бы предпочел использовать SingleOrDefault или FirstOrDefault в зависимости от задачи.

...