2013-04-09 29 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(); 

我希望这可以帮助。

相关问题