2010-08-10 77 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));