繁体   English   中英

在foreach循环中使用lambda表达式是否有任何问题?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM