LINQ方法来实现这个代码

min*_*int 3 c# linq

我现在有一个方法循环遍历业务对象列表(属性属性)来测试属性SerialNumber是否是序列号.如果我找到一个序列号,我退出循环并返回true,否则我返回false.

代码如下:

  public bool HasSerialNumber()
  {
      if (this.Properties != null && this.Properties.Count > 0)
      {
          foreach (var property in Properties)
          {
              if (!string.IsNullOrEmpty(property.SerialNumber))
                  return true;
          }
      }
      return false;
  }
Run Code Online (Sandbox Code Playgroud)

有没有更好的LINQ方法呢?

我有以下几点:

return Properties.Where(x => !string.IsNullOrEmpty(x.SerialNumber)).ToList().Count > 0;
Run Code Online (Sandbox Code Playgroud)

是否有更好/更快的方法来检查非空字符串?

Łuk*_*.pl 12

您可以使用Any而不是检查计数是否大于零.

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber))
Run Code Online (Sandbox Code Playgroud)

当然,你的Properties.Count > 0支票是多余的.

  • +1.除了更好地传达你的意图之外,使用`Any()`的额外好处是底层列表只会被迭代,直到找到带有序列号的属性.如果使用Count()或ToList(),则必须评估完整列表,因此会丢失一些性能.当然,在这种情况下它不会有很大的不同,但仍然如此. (4认同)

Jus*_*ner 9

退房IEnumerable<T>.Any():

public bool HasSerialNumber()
{
    if(this.Properties != null)
        return Properties.Any(p => !string.IsNullOrEmpty(p.SerialNumer));
    return false;
}
Run Code Online (Sandbox Code Playgroud)


Rya*_*ner 6

我不认为你会提高特别是在性能string.IsNullOrEmpty(),而是一个陷阱,你应该避免在你的查询的最后2个呼叫-特别是ToList()Count().

你在做什么是遍历每个元素,将它转换为一个列表(创建一个列表并在过程中添加项目,然后遍历列表中的每个元素来计算有多少元素 - 所有元素都检查单个值是空的.

您可以使用该Any方法查找单个元素是否符合某些条件,如下所示:

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber));
Run Code Online (Sandbox Code Playgroud)