【问题标题】:Use Func in Ilist, why lambda expression?在 Ilist 中使用 Func,为什么是 lambda 表达式?
【发布时间】:2012-01-21 02:02:29
【问题描述】:

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

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

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

【问题讨论】:

  • Single 使用foreach 实现。请注意,Single 将迭代整个列表并在没有完全符合条件的Client 时抛出异常。您可能想改用FirstFirstOrDefault

标签: c# lambda anonymous-methods


【解决方案1】:

您的代码是正确的,这个 lambda 表达式基本上是一个返回 bool 的方法(在这种特定情况下)。所以想象一下,对于 ListOfClient 中的每个项目,它都会尝试执行该方法,如果它返回 true,那么它将返回该项目。

您需要小心,如果您的列表中有 0 个或多于 1 个匹配项,则使用 Single 会失败。

如果您确定只有 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

【讨论】:

  • 谢谢,有没有办法不用lamba 来写?我对lamba表达感到很困惑,因为它们有更多的含义。并且帮助说有 Func 预期
  • @Petr,当你写 c => c.ID == ID 时,这确实是一个Func<Client, bool>,所以这很好。 Func 的含义是一个返回一些东西并通过参数获取一些东西的方法
  • 谢谢,能不写lamba表达式吗?如果是这样,你能告诉我怎么做吗?谢谢
  • @Petr,在这种情况下不是这样,有时有一个捷径可以写成.Single(MyMethod),然后你定义public bool MyMethod(Client c)。在这种情况下,您需要另一个 ID 进行比较,因此不适用
  • @Petr 在这里查看更多信息msdn.microsoft.com/en-us/library/bb549151.aspx
【解决方案2】:

来自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,具体取决于任务。

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多