LINQLambda何时在foreach循环中执行

mftmpeh8  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(127)

所以,为了保持简短,我有这样一段代码,在其中我循环通过字符串拆分的结果,并将它们添加到列表中,如果它们在循环之前没有出现过。这是密码

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

字符串
但是在我写了这段代码之后,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);
}

r1zhe5dt

r1zhe5dt1#

下面是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");
}

字符串
输出的结果将是

lambda
lambda
lambda
loop
lambda
loop
lambda
lambda
loop


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

xienkqul

xienkqul2#

基本上,你只是想得到不同的值:

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

字符串

juud5qan

juud5qan3#

我构建在Dmitry's answer上,并使输出更详细一些,以向您展示实际情况。还要注意,作为Ufuk noted,有更好的方法来实现不同值的列表。
你可以自己测试一下,在这个dotnetfiddle中稍微玩一下。

示例如下:

List<int> input = new List<int> {1, 1, 2, 2, 3, 4};
var res = new List<int>();
foreach (int s in input.Where(s => 
    { 
        Console.WriteLine("lambda: s=" + s);
        Console.WriteLine("lambda: " + s + " contained in res? " + res.Contains(s));
        return !res.Contains(s);
    }))
{
    res.Add(s);
    Console.WriteLine("loop: " + s + " added to res");
    Console.WriteLine();
}

字符串

输出如下:

lambda: s=1
lambda: 1 contained in res? False
loop: 1 added to res

lambda: s=1
lambda: 1 contained in res? True
lambda: s=2
lambda: 2 contained in res? False
loop: 2 added to res

lambda: s=2
lambda: 2 contained in res? True
lambda: s=3
lambda: 3 contained in res? False
loop: 3 added to res

lambda: s=4
lambda: 4 contained in res? False
loop: 4 added to res

相关问题