在Ilist中使用Func,为什么lambda表达式?

时间:2011-12-15 11:01:46

标签: c# lambda anonymous-methods

我有一个客户类型的IList。我需要遍历它并返回一个匹配某些条件的元素。我想比foreach使用“更聪明”的方式,所以我尝试了Single方法,但是我不确定为什么这样做,如果它可以以不同的方式完成(我不是那么先进):

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

我不明白lambda表达式的使用..我尝试了一个匿名方法但是无法正确编写它。 感谢

2 个答案:

答案 0 :(得分:1)

您的代码是正确的,这个lambda表达式基本上是一个返回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

答案 1 :(得分:0)

来自MSDN

  

lambda表达式是一个匿名函数,可以包含表达式和语句,可用于创建委托或表达式树类型。

这意味着您的代码等同于

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

来自another article of MSDN

  

谓词代表。表示定义一组条件并确定指定对象是否符合条件的方法。

这意味着它将检查集合中每个元素的标准return c.ID == ID;,并返回满足要求的元素。

PS小心Single方法。我希望根据任务使用SingleOrDefaultFirstOrDefault