什么时候LINQ lambda语句在foreach循环中执行?
本文关键字:循环 执行 foreach LINQ lambda 语句 什么时候 | 更新日期: 2023-09-27 18:14:55
因此,为了保持简短,我使用了这段代码,在其中循环遍历字符串拆分的结果,并将它们添加到一个列表中,如果它们在循环之前没有出现过。这是代码
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);
}
下面是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
循环
基本上你只是试图得到不同的值:
var res = input.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries)
.Distinct()
.ToList();
我以Dmitry的回答为基础,使输出稍微冗长一些,以便向您展示实际情况。还要注意的是,正如Ufuk所指出的,有更好的方法来实现不同值的列表。
请随意测试,并在这个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