![](/img/trans.png)
[英]Using Distinct in Lambda Expression and use it in foreach loop
[英]Are there any issues using a lambda expression in a foreach loop?
我编写了一个快捷的C#控制台应用程序,用于在日志文件中搜索另一个文件中的字符串。 在一种情况下,我传入了三个要搜索的文件和一个输入文件。 该程序将所有输入文件中的值作为对象列表加载到内存中。 对象的属性之一是将项目标记为已找到的布尔值。
因为我希望输入文件中的每个值只能被找到一次,所以我将对象的属性更新为true,然后脱离了遍历日志文件每一行的循环。 休息到位后,应用程序说18个项目不匹配。 注释中断后,将找到所有输入值。 输入文件中没有重复的值。 我的lambda表情是否可能不符合我的想法?
while ((line = sr.ReadLine()) != null)
{
foreach (var needle in needles.Where(d => d.Found == false))
{
if (line.Contains(needle.SearchValue))
{
needle.Found = true;
//break; //works without break, misses some with break
}
}
}
假定缺少的行的示例:
Completed Document 48166115
Completed Document 48166120
Completed Document 48371705
Completed Document 48371710
Completed Document 48371720
包含以下某些值的日志样本:
06/20/13 20:53:22 - Completed Document 48132000, 2 pages
06/20/13 20:53:23 - Completed Document 48166115, 2 pages
06/20/13 20:53:23 - Completed Document 48166116, 2 pages
06/20/13 20:53:23 - Completed Document 48166117, 2 pages
06/20/13 20:53:23 - Completed Document 48166118, 2 pages
06/20/13 20:53:24 - Completed Document 48166119, 2 pages
06/20/13 20:53:24 - Completed Document 48166120, 2 pages
06/20/13 20:53:24 - Completed Document 48166121, 2 pages
您可能已经这样做了,但是为了排除您不知道的事情,您可以在标记内放置一个控制变量增量。 最后检查您的数字是否符合您的期望。 应将多少个标志更改为true? 实际上有多少人受到打击?
if (line.Contains(needle.SearchValue))
{
needle.Found = true;
controlVariable++;
}
您的中断是整个foreach循环的中断,因此先前!Found的第一个针将停止对其他针的检查。
这意味着,如果多根针在一条线上成功,则只会标记第一根,其余的将被遗漏。 鉴于您只期望获得一次成功,这意味着他们永远不会成功。
中断将退出foreach循环,因此一旦找到第一个匹配项,所有后续的指针将保持未搜索状态。
如果突破结果导致所有项目都匹配,则必须重复。
为了解决此问题,我在程序中添加了另一个参数,以允许将后缀添加到输入文件中的搜索值中。 因此,line.Contains方法参数基本上包含前缀+ +后缀。
在日志中,文档编号后有一个逗号,因此我将其作为后缀。 该程序指示未找到22个项目。 在开始检查缺失值之前,我真的很困惑。 他们真的不见了!
所以,发生了什么事:
没有休息,较短的数字将错误地匹配较大的数字,而较大的数字将正确匹配。 (无缺失值)
休息时,较短的数字与较大的一个匹配,而较大的一个被跳过。 实际存在跳过的值,这使我感到困惑。
使用中断和后缀,可以将较小的丢失值正确记录为丢失,而找到较大的值。 因此,扫描仪现在比以前更快,更准确。
感谢您的所有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.