【发布时间】:2015-10-20 01:25:04
【问题描述】:
所以,为了简短起见,我有这段代码,我在其中循环遍历字符串拆分的结果并将它们添加到列表中,如果它们之前没有在循环中发生过。这是代码。
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);
}
【问题讨论】:
-
你为什么不试试呢?
-
foreach将枚举整个语句评估后产生的 IEnumerable。整个 LINQ 语句在foreach甚至开始之前进行评估 -
一开始只有一次
-
@AlekDepler 实际上是在循环开始之前。
foreach将在 调用Where返回最终的 IEnumerable 之后执行