何时检查List <t>是否为null,何时为0和何时</t>

时间:2013-04-09 08:41:34

标签: c# linq

我使用ADO.NET实体框架,并且经常有这样的代码片段:

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

从现在开始,我没有多想太多,只是做了这个检查:

if (entity.Count > 0)
相信这就足够了。现在,我发现很多人都会检查Any()null。如何在某种情况下确定我需要什么样的检查,在这种情况下,正如我所说 - 我经常使用if (entity.Count > 0)足够吗?

8 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

如果您有.ToList()来电,那么该列表始终是一个列表。也许是空的,但永远不会为空。

检查.Any()而不是.Count() > 0是大多数容器或枚举的性能提升,因为.Any()只会触及第一个元素(如果有)。虽然你对结果不感兴趣,但.Count()需要通过你的容器计算到最后,只是因为它不是零。

答案 2 :(得分:2)

取决于您的需求。

如果您只想知道任何实体是否与您的谓词匹配,请使用Any(),因为它会在找到第一个匹配实体后立即返回。 Count() / Count将需要处理通常会慢得多的所有实体。

也更喜欢Linq的Count()到列表Count,因为它不必在内存中创建完整列表,对于大型结果集来说这可能非常昂贵。

答案 3 :(得分:2)

Any()将提供更好的解决方案,因为它会在首次匹配后停止。

此外

如果ToList()为真,我建议只执行Any()

您将保存(微)表现。

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

答案 4 :(得分:2)

entity.Any() - 如果您的集合中有任何实体,则返回true。 entities.Count()== 0也会这样做。但我建议使用any,因为它会更快。因为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
}

希望它有所帮助。

答案 5 :(得分:2)

当您拨打if (entity.Count > 0)entity == null时,您会收到例外情况,因为实体未初始化时.Count不存在。

答案 6 :(得分: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();

我希望这会有所帮助。

答案 7 :(得分:1)

entity.Any()是更好的选择。而且您不需要调用.ToList(),因为这将从数据库中获取所有数据,然后只检查它的计数。