查找并更改列表中满足要求的第一个元素的值,如果找不到则执行其他操作

Pri*_*six 0 c# linq performance

这似乎非常简单,但我似乎找不到一种方法来做到这一点。基本上就是标题,我想找到列表中满足要求的第一个项目,并修改找到的项目的值,如果该列表中没有一个项目满足要求,则执行其他操作。

我使用了 foreach 循环,但这绝对不是最快的方法。

foreach (CustomClass foo in bar)
{
    if (!foo.Value)
    {
         foo.Value = true;
         currentCount++;
         break;
    }
}
Run Code Online (Sandbox Code Playgroud)

List.First()然后,当找不到值时,我尝试使用并捕获异常,但这要慢得多,而且我正在寻找性能。

编辑:不要介意下面的内容,我找到了如何使第一个或默认工作,但是有没有比 foreach 方法更快的方法多次执行此操作?谢谢


所以我尝试了 FirstOrDefault,但我不断收到空引用异常

if (bar.FirstOrDefault(c => c.Value == false).Equals(null))
{
    break;
}
else
{
    thePicture.FirstOrDefault(c => c.Value == false).Value = true;
    currentCount++;
}
Run Code Online (Sandbox Code Playgroud)

有人知道如何使第一个或默认工作吗?或者有没有比 foreach 方法更快的其他方法。(这将在另一个循环中运行很多次)谢谢!

Jon*_*eet 5

FirstOrDefault如果没有找到元素,将返回空引用 - 假设元素类型是引用类型。不要调用Equals结果,只需使用==... 并且不要调用它两次:

var first = bar.FirstOrDefault(c => !c.Value);
if (first == null)
{
    ...
}
else
{
    // Use first, I suspect.
    // (You don't in the sample code, but...)
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不会比适当的循环更快foreach,但它更具可读性。

  • 对 C# 有点陌生,如果这个问题很明显,那么提前抱歉,但是“first”是 bar 中项目的浅表副本,所以当我更改 first 时,仍然会更改 bar 中的项目吗? (2认同)
  • @HandofC'thuhlu:假设您的列表是类列表,它是一个参考。如果您不确定引用是如何工作的,您现在应该了解更多信息 - 这对于有效地使用 C# 至关重要。请参阅http://pobox.com/~skeet/csharp/references.html (2认同)