C# 何时检查列表<;T>;对于null,当为0时,当两者同时存在时

C# 何时检查列表<;T>;对于null,当为0时,当两者同时存在时,c#,linq,C#,Linq,我使用ADO.NET实体框架,通常会有如下代码片段: List<Sole> entity = soleService.All() .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20)) .ToList(); 相信这已经足够了。现在我看到很多人用Any()检查null。如何确定在特定情况下我需要什么样的检查,以及在我说过的特定情况下我经常使用的检查是如果(entity.Count

我使用ADO.NET实体框架,通常会有如下代码片段:

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

相信这已经足够了。现在我看到很多人用
Any()
检查
null
。如何确定在特定情况下我需要什么样的检查,以及在我说过的特定情况下我经常使用的检查是
如果(entity.Count>0)
足够了?

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

如果您有一个
.ToList()
调用,则列表始终是一个列表。可能是空的,但从不为空


检查
.Any()
而不是
.Count()>0
对于大多数容器或可枚举项来说是一种性能改进,因为
.Any()
只会在有第一个元素的情况下触及第一个元素
.Count()
将需要通过容器一直计数到最后,尽管您对结果不感兴趣,只是因为它不是零。

取决于您需要什么

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

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

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

此外

如果
Any()
为真,我建议也只做
ToList()

您将节省(微型)性能

var t = soleService.All()  .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20));
if  (t.Any()) entity =t.ToList();
entity.Any()-如果集合中存在任何实体,则将返回true。entities.Count()==0将执行相同的操作。但我建议使用any,因为它会更快。因为Count将返回集合中的数据量,但在集合中找到的第一项上会触发any。 但如果您不确定集合是否已初始化,我建议您使用下一个构造:

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
}
希望有帮助。

如果(entity.Count>0)
如果(entity.Any())
在您的情况下是相同的。由于您已经从数据库中获取了所有数据,因此已经构建了列表,您知道它的大小。因此,
.Count
属性不会迭代任何内容

另一方面,如果没有获取所有数据,请不要调用
.Count()
IEnumerable
扩展,因为它将免费枚举项

改用:

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

if (test)
{
...
}

此外,LINQ扩展不会返回null,而是返回一个空的
IEnumerable
,因此在调用
if(entity.Count>0)
entity==null
时,不要检查
null

,您将得到一个异常,因为
.Count
不存在,而实体未初始化。

当然,列表可以是
null
或空的。如果您尝试如上所述使用LINQ创建
列表
,并且
soleService
可能为空,在这种情况下,您将得到
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();
列表实体=null;
// ...
if(soleService!=null&&soleService.Count>0)
entity=soleService.All()
其中(s=>(s.ShoeLastID==ShoeLastID)和&(s.Status==20))
.ToList();

我希望这能有所帮助。

使用
Any()
而不是
Count()
,因为性能问题
Count()
需要迭代整个列表,其中
Any()
只要找到至少一项+1条毒蛇,就会停止。此外,对于集合,Entity Framework将永远不会返回
null
。@Viper+1您的评论应该是答案。谢谢,这正是我所需要的。
如果(Entity.Count>0)或(Entity.Any())在您的情况下相同
。不,不是。Count()将比任何()都慢@Maris.Count()扩展方法与IList的.Count属性非常不同。
Count()
如果对象是
ICollection
,则不枚举项。因此,
Count
Count()
之间的性能影响只是装箱所用的时间。
List<Sole> entity = null;
// ...
if (soleService != null && soleService.Count > 0)
    entity = soleService.All()
        .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20))
        .ToList();