C# 何时检查列表<;T>;对于null,当为0时,当两者同时存在时
我使用ADO.NET实体框架,通常会有如下代码片段: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
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();