2013-04-09 52 views
3

我使用ADO.NET實體框架,而且往往有代碼片斷這樣的時候:何時檢查列表<T>爲NULL,0和當兩個

List<Sole> entity = soleService.All() 
    .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20)) 
    .ToList(); 

因爲現在我還沒有想太多它,只是做這個檢查:

if (entity.Count > 0) 

認爲這是不夠的。現在我看到很多人檢查Any()null。如何確定在某種情況下我需要什麼樣的檢查,並在這種特定的情況下,正如我所說 - 我經常使用的是if (entity.Count > 0)夠了嗎?

+6

使用任何'()''以上計數()'因爲性能。 'Count()'需要遍歷整個列表,其中'Any()'只要至少找到一個項目 – Viper 2013-04-09 08:43:39

+2

+1 Viper即可停止。實體框架也不會爲集合返回'null'。 – 2013-04-09 08:44:39

+0

@Viper +1你的評論應該是答案。 – chridam 2013-04-09 08:45:29

回答

3

if (entity.Count > 0)if (entity.Any())相同在你的情況。由於您已經從數據庫中提取了所有數據,因此該列表已經建立並且您知道它的大小。所以.Count屬性不會遍歷任何東西。

另一方面,如果您沒有提取所有數據,請不要調用.Count()IEnumerable擴展名,因爲它將枚舉項目爲空。

使用,而不是:

bool test = soleService.All() 
    .Any(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20)); 

if (test) 
{ 
... 
} 

此外,LINQ的擴展不會返回null,但空IEnumerable,所以不檢查null

+0

感謝,正是我需要的。 – Leron 2013-04-09 08:50:58

+0

'if(entity.Count> 0)或if(entity.Any())在你的情況下是相同的。不,這不對! .Count()將比Any()更慢! – Maris 2013-04-09 08:53:26

+3

@Maris .Count之間()擴展方法是自IList ken2k 2013-04-09 08:55:48

1

entity.Any()是更好的選擇。你不需要調用.ToList(),因爲這將從數據庫中獲取所有數據,然後檢查它的數量。

2

如果你有一個.ToList()調用,那麼列表總是一個列表。也許是空的,但從不爲空。

.Any(),而不是.Count() > 0的檢查是大多數容器或可枚舉,因爲如果有一個.Any()將只接觸的第一個元素的性能改進。 .Count()需要通過你的容器計算到最後,儘管你對結果不感興趣,只是事實上它不是零。

2

取決於你需要什麼。

如果您只是想知道是否有任何實體符合您的謂詞,請使用Any(),因爲它會在找到第一個匹配的實體時立即返回。 Count()/Count將需要處理所有通常會慢得多的實體。

也更喜歡Linq的Count()到列表Count,因爲它不必在內存中創建完整列表,這對於大型結果集來說可能非常昂貴。

2

Any()將提供更好的解決方案,使其在第一次匹配後停止。

除了

我建議也做ToList()只有如果Any()是真實的。

你會節省(微)性能。

var t = soleService.All() .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20)); 
if (t.Any()) entity =t.ToList(); 
2

entity.Any() - 如果集合中有實體,則返回true。 entities.Count()== 0將執行相同的操作。但我會建議使用任何因爲它會更快。因爲Count會返回集合中的數據量,但任何會觸發集合中找到的第一個項目。 但是,如果你不能確定你的集合初始化我會建議你使用下一個建設:

if(entity!=null && entity.Any()) 
{ 
    //Do something. You will get her always without error, And you will be 100% sure that your collection is not empty and it is initialized 
} 

希望它能幫助。

2

當你調用if (entity.Count > 0)entity == null,你會因爲.Count實體未初始化不存在得到一個異常。

2

當然名單可以null或空。如果您嘗試使用LINQ如上創建List<Sole>soleService可以爲null,在這種情況下,你會得到一個NullReferenceException。所以我會檢查soleService是不是null或先空。所以

List<Sole> entity = null; 
// ... 
if (soleService != null && soleService.Count > 0) 
    entity = soleService.All() 
     .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20)) 
     .ToList(); 

我希望這可以幫助。

相關問題