LINQ Lambdas何时在foreach循环中执行

Hug*_*oC4 1 c# linq lambda

所以,为了简短起见,我有一些代码,我循环遍历字符串拆分的结果并将它们添加到列表中,如果它们在循环之前没有发生过.这是代码.

var res = new List<string>();
foreach(string s in input.Split(new[] { ", " }, 
              StringSplitOptions.RemoveEmptyEntries))
{
    if(res.All(p => p != s))
        res.Add(s);
}
Run Code Online (Sandbox Code Playgroud)

但在我编写这段代码之后,Visual Studio说我可以将部分循环转换为LINQ.但是,我对这是否有效持怀疑态度.

基本上,我的问题是,lambda表达式是在每个单独的循环上执行,还是在开头只执行一次?

var res = new List<string>();
foreach (string s in input.Split(new[] { ", " }, 
              StringSplitOptions.RemoveEmptyEntries)
                          .Where(s => res.All(p => p != s)))
{
    res.Add(s);
}
Run Code Online (Sandbox Code Playgroud)

Dmi*_*oly 8

以下是对Linq查询进行惰性求值评估的示例.

List<int> vals = new List<int> {1, 1, 2, 2, 3, 4};
var res = new List<int>();
foreach (int s in vals.Where(s => 
                       { 
                           Console.WriteLine("lambda"); 
                           return s % 2 == 0; 
                       }))
{
    Console.WriteLine("loop");
}
Run Code Online (Sandbox Code Playgroud)

输出将是

lambda
lambda
lambda
loop
lambda
loop
lambda
lambda
loop
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,仅当foreach循环需要下一个元素时才会计算lambda


Ufu*_*arı 7

基本上你只是想获得不同的价值观:

var res = input.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries)
               .Distinct()
               .ToList();
Run Code Online (Sandbox Code Playgroud)

  • @juharr但这个答案属于这里只是为了表明好的代码可以解决诸如"我不知道这段代码如何工作"之类的问题 (3认同)