2010-08-10 61 views
3

我现在有一个方法,通过循环业务对象列表(属性属性)来测试属性SerialNumber是否是序列号。如果我找到序列号,则退出循环并返回true,否则返回false。此代码的LINQ方法

代码如下:

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; 
    } 

有没有更好的办法LINQ这个?

我记住以下几点:

return Properties.Where(x => !string.IsNullOrEmpty(x.SerialNumber)).ToList().Count > 0; 

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

+0

即使你的榜样,您可以用'.Count中()'而不是'.ToList()。Count'来加快速度。'Any()'是要走的路。 – 2010-08-10 13:30:09

+0

@callum它给了我一个编译器错误当我只有.Count(),所以我不得不打电话给ToList()。除非我说错了...... – mint 2010-08-10 13:32:05

+0

@snow:奇怪,它应该工作。至少这样做:var strs = new [] {“”,“lol”,null}; Console.WriteLine(strs.Where(s => string.IsNullOrEmpty(s))。Count());' – 2010-08-10 13:35:27

回答

12

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

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber)) 

当然你的Properties.Count > 0检查是多余的。

+4

+1。除了更好地传达你的意图之外,使用Any()的额外好处是只有在找到具有序列号的属性时才会迭代基础列表。如果使用Count()或ToList(),则必须对完整列表进行评估,因此会失去一些性能。当然,在这种情况下它不会有很大的变化,但仍然是这样。 – jeroenh 2010-08-11 12:39:38

3

这应该做的伎俩:

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber)); 
9

退房IEnumerable<T>.Any()

public bool HasSerialNumber() 
{ 
    if(this.Properties != null) 
     return Properties.Any(p => !string.IsNullOrEmpty(p.SerialNumer)); 
    return false; 
} 
6

我不认为你会提高特别是关于string.IsNullOrEmpty()的表现,但一个陷阱,你应该避免是您查询中的最后2个电话 - 特别是ToList()Count()

你在那里做的是遍历每一个元素,将它转换为一个列表(创建一个列表并在这个过程中添加项目,然后迭代列表中的每个元素来统计有多少 - 所有要检查的如果一个值是空

可以使用Any方法找到,如果一个元素符合一定规则的,就像这样:

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber));