3

我使用 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)足够了?

4

8 回答 8

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.

于 2013-04-09T08:47:59.883 回答
2

如果您有.ToList()电话,则列表始终是列表。可能为空,但绝不为空。

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

于 2013-04-09T08:44:41.980 回答
2

取决于你需要什么。

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

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

于 2013-04-09T08:45:13.903 回答
2

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

此外

我建议也ToList() Any()为真时才这样做。

您将节省(微)性能。

var t = soleService.All()  .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20));
if  (t.Any()) entity =t.ToList();
于 2013-04-09T08:46:32.147 回答
2

entity.Any() - 如果您的集合中有任何实体,将返回 true。entity.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
}

希望能帮助到你。

于 2013-04-09T08:46:46.253 回答
2

当你调用if (entity.Count > 0)butentity == null时,你会得到一个异常,因为实体未初始化.Count时不存在。

于 2013-04-09T08:48:00.633 回答
2

当然,列表可以是也可以是null空的。如果您尝试List<Sole>如上所述创建 using LINQ 并且soleService可能为 null,在这种情况下您将获得一个NullReferenceException. 所以我会先检查soleServiceis 不是null或空的。所以

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

我希望这有帮助。

于 2013-04-09T08:48:38.010 回答
1

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

于 2013-04-09T08:44:17.290 回答