C# C语言中带foreach循环的Lambda表达式#

C# C语言中带foreach循环的Lambda表达式#,c#,lambda,C#,Lambda,有人能告诉我这个代码块的lambda表达式是什么吗?在您的代码块中有一个,它是Where的唯一参数,如下所示: var coupon=" "; foreach(var p in products) { var query = products.Where(b => b.getId() == p.getId()).ToList(); if (query != null) { foreach(var q in query)

有人能告诉我这个代码块的lambda表达式是什么吗?在您的代码块中有一个,它是
Where
的唯一参数,如下所示:

 var coupon=" ";

 foreach(var p in products)
 {
     var query = products.Where(b => b.getId() == p.getId()).ToList();

     if (query != null)
     {
         foreach(var q in query)
         {
             coupon = q.getName();
             Console.WriteLine(coupon);
         }
     }
 }

在这种特殊情况下,lambda实际上是(尽管从技术上讲不是)a,这是一个奇特的名称,用于测试某个函数是否为
true
false

并非每个循环操作都适合lambda表达式。Lambda表达式对于数据的投影很有用——例如,将数据从一种形式转换为另一种形式——应用公式等,但是:这不是您在这里要做的。您正在对数据(控制台.WriteLine)执行某些操作。您可以在这里对LINQ执行一些操作,包括
SelectMany
,但是…它的可读性会降低,而不是更高

你已经读到的很好。我唯一要做的更改是:

  • 要删除
    if(query!=null)
    测试,这永远不会是错误的
  • 删除
    ToList()
    -不需要创建新列表来迭代它
  • 无需在需要之前申报
    优惠券
  • 我可能会提起
    p.getId()
因此:


您的问题完全不清楚。对于此代码的哪一部分,您需要一个表达式?无论如何,这个问题太广泛了,特别是您没有提供任何自己的负担。我们不是来做您的工作的。对于每个产品
p
,它会写出与
p
共享ID的所有产品
q
的优惠券名称(包括
p
本身)。我想知道那是什么ID。我同意你的说法,不是每个循环操作都适合lambda表达式。但是,如果我们想为所有优惠券名称创建一个
IEnumerable
,而不是
Console.WriteLine
,那么它可能属于数据投影的范畴……从技术上讲,参数要求由
.Select
编辑的是
Func
,而不是.NET-2.0风格的方法中的
谓词,例如
List.FindAll(…)
,但是
Func
谓词是等价的(相同的签名和返回类型)。好的一点是,我用这一澄清更新了我的答案。
b => b.getId() == p.getId()
 foreach(var p in products)
 {
     var id = p.getID();
     foreach(var q in products.Where(b => b.getId() == id))
     {
         var coupon = q.getName();
         Console.WriteLine(coupon);
     }
 }