IEnumerable.Count() or ToList().Count (不进行翻译)

15 浏览
0 Comments

IEnumerable.Count() or ToList().Count (不进行翻译)

我有一个类的对象列表,看起来像这样:\n

public class IFFundTypeFilter_ib
{
    public string FundKey { get; set; }
    public string FundValue { get; set; }
    public bool IsDisabled { get; set; }
}

\n属性\"IsDisabled\"通过执行查询\"collection.Where(某些条件)\"并计算匹配对象的数量来设置。结果是不包含\"Count\"属性的\"IEnumarable\"。我想知道哪个更快。\n这个:\n

collection.Where(某些条件).Count();

\n还是这个:\n

collection.Where(某些条件).ToList().Count;

\n集合可能包含少量对象,但也可能包含例如700个对象。我将两次进行计数调用,并使用其他条件。在第一个条件中,我检查\"FundKey\"是否等于某个键,而在第二个条件中,我进行相同的比较,但与其他键值进行比较。

0
0 Comments

IEnumerable.Count() or ToList().Count 这个问题的出现是因为在某些情况下,我们需要获取集合(collection)中满足某个条件的元素的数量,而我们有两种常见的方法来实现这个目标:使用IEnumerable.Count()或者使用ToList().Count。

在给定的代码示例中,使用ToList().Count的方式并不合理。因为使用ToList()方法会将满足条件的元素全部复制到一个新的List集合中,然后再通过Count属性获取集合的元素数量。这样做的话,在只需要获取元素数量而不需要实际使用集合中的元素时,会浪费内存和时间。

相比之下,使用IEnumerable.Count()的方式更为合适。IEnumerable.Count()方法会在不复制元素的情况下直接返回集合中满足条件的元素数量,避免了不必要的内存和时间消耗。

然而,当我们需要在获取元素数量之后还需要对满足条件的元素进行其他操作时,使用ToList()方法就是一个合理的选择。通过将满足条件的元素复制到一个新的List集合中,我们可以在之后的代码中继续使用这个集合,并进行其他操作。

总之,当我们只需要获取集合中满足条件的元素数量时,使用IEnumerable.Count()方法是最合适的。而当我们需要在获取元素数量之后还需要对满足条件的元素进行其他操作时,使用ToList()方法可以更好地满足需求。

0
0 Comments

在使用 LINQ 查询时,有时候我们需要获取集合中满足某个条件的元素个数。在这种情况下,我们可以使用 IEnumerable 接口的 Count() 方法或者将查询结果转换为 List 后再使用 Count 属性来实现。然而,这两种方法可能存在一些效率上的问题。

一般来说,将查询结果转换为 List 的方式效率会较低。这是因为转换为 List 需要将所有元素都加载到内存中,而不仅仅是计算满足条件的元素个数。所以如果只需要获取元素个数而不需要使用查询结果的其他信息,就没有必要将查询结果转换为 List。

另外,如果查询条件较多,那么将查询结果转换为 List 或者缓存查询结果也没有意义。我们可以直接使用 Count 方法的重载版本,它接受一个条件表达式作为参数来计算满足条件的元素个数。例如,collection.Count(somecondition) 就可以获取满足 somecondition 条件的元素个数。

有人可能会提到,使用 Where(x).Count() 和 Count(x) 是等效的。这是因为 Where(x).Count() 实际上会创建并链接两个枚举器,而 Count(x) 只需要一个枚举器。然而,这种性能上的差异对于大多数情况来说是可以忽略的。特别是如果是在像 Entity Framework 这样的 ORM 框架中使用,Count(x) 和 Where(x).Count() 最终都会被转换为相同的 SQL 查询语句。所以在实际编码中,我们应该以代码的可读性和简洁性为主,并不需要过于关注这种微小的性能差异。

总结起来,我们在使用 LINQ 查询时,可以根据实际情况选择使用 IEnumerable 接口的 Count() 方法或者将查询结果转换为 List 后再使用 Count 属性来获取满足条件的元素个数。如果只是简单的计数操作,而不需要使用查询结果的其他信息,那么直接使用 Count() 方法会更高效。而对于复杂的查询条件,可以使用 Count 方法的重载版本来计算满足条件的元素个数。在实际编码中,我们应该以代码的可读性和简洁性为主,不需要过度关注微小的性能差异。

0
0 Comments

在这段代码中,作者测试了获取集合数量的多种方法,并对它们的执行时间进行了测量。作者使用了一个长度为1000000的Enumerable来创建了一个List,然后对获取集合数量的方法进行了测试。测试代码使用了Stopwatch来测量每个方法的执行时间,并忽略了垃圾回收发生的结果。最后,作者计算了每个方法的平均执行时间。

测试结果显示,执行时间从慢到快的顺序依次为:

- () => enumerable.Select(x => x).ToList().Count() : 14.879

- () => list.Select(x => x).ToList().Count() : 14.188

- () => enumerable.Where(x => x % 2 == 0).ToList().Count() : 10.849

- () => enumerable.ToList().Count() : 10.080

- () => enumerable.Select(x => x).Count() : 9.562

- () => list.Where(x => x % 2 == 0).ToList().Count() : 8.799

- () => enumerable.Where(x => x % 2 == 0).Count() : 8.350

- () => list.Select(x => x).Count() : 8.046

- () => list.Where(x => x % 2 == 0).Count() : 5.910

- () => enumerable.Count() : 4.085

- () => list.ToList().Count() : 1.133

- () => list.Count : 0.000

- () => list.Count() : 0.000

从结果中可以看出两个重要的事实:

1. 在代码中使用ToList()的方法明显比不使用ToList()的方法慢。

2. LINQ操作符会尽可能地利用可枚举对象的底层类型来进行计算的优化。enumerable.Count()和list.Count()方法就显示了这一点。

在list.Count和list.Count()的调用中没有区别。因此,关键的比较在于enumerable.Where(x => x % 2 == 0).Count()和enumerable.Where(x => x % 2 == 0).ToList().Count()的调用。由于后者包含了额外的操作,我们预计它会花费更长的时间,实际上比前者多了近2.5毫秒。

如果你要调用两次计数代码,那么最好构建列表。如果不是,那么在查询之后直接使用.Count()方法即可。

在这段代码中,平均时间的单位是毫秒。

关于为什么在List上使用Count()方法,List已经有了Count属性,不需要使用Linq的Count()方法,除非它在内部也是这样做的,这样做会更好地进行比较测试,比如使用IEnumerable.Count()和List.Count()进行比较。

作者回答说,LINQ的Count()方法在列表中使用了.Count,几乎没有任何性能损失。

0