LINQ Count()直到,这样效率更高吗?

时间:2012-03-09 01:21:02

标签: c# performance linq ienumerable micro-optimization

说我想检查一个集合中是否至少有N个元素。

这比做好吗?

Count() >= N

使用:

    public static bool AtLeast<T>(this IEnumerable<T> enumerable, int max)
    {
        int count = 0;
        return enumerable.Any(item => ++count >= max);
    }

甚至

    public static bool Equals<T>(this IEnumerable<T> enumerable, int amount)
    {
        return enumerable.Take(amount).Count() == amount;
    }

我怎么能对此进行基准测试?

    /// <summary>
    /// Returns whether the enumerable has at least the provided amount of elements.
    /// </summary>
    public static bool HasAtLeast<T>(this IEnumerable<T> enumerable, int amount)
    {
        return enumerable.Take(amount).Count() == amount;
    }

    /// <summary>
    /// Returns whether the enumerable has at most the provided amount of elements.
    /// </summary>
    public static bool HasAtMost<T>(this IEnumerable<T> enumerable, int amount)
    {
        return enumerable.Take(amount + 1).Count() <= amount;
    }

2 个答案:

答案 0 :(得分:5)

.Count()方法内置了一些记录良好的优化。具体来说,如果您的可枚举是ICollection.Count()将是一个常量操作,因为它将使用ICollection的{​​{1}}属性。

但是,在一般情况下,它将迭代整个.Count以获得计数。如果您没有IEnumerable,当您有超过N个元素时,最好使用两种建议方法中的任何一种。对于这两者的相对表现,你必须像其他人所建议的那样描述它们。

答案 1 :(得分:2)

        var list = Enumerable.Range(1, 1000000);
        var t = new Stopwatch();

        t.Restart();
        var count = list.Count() > 100000;
        t.Stop();
        PrintTime(t, count);

        t.Restart();
        var atLeast = list.AtLeast(100000);
        t.Stop();
        PrintTime(t, atLeast);

        t.Restart();
        var equals = list.Equalss(100000);
        t.Stop();
        PrintTime(t, equals);

PrintTime()打印出计时器滴答的结果:

True 20818
True 8774
True 8688