为什么我应该使用 Any 方法而不是 Count 方法?

30 浏览
0 Comments

为什么我应该使用 Any 方法而不是 Count 方法?

为什么我应该使用`Any()`而不是`Count()`呢?如果我们看一下msdn的示例:\n

class Pet
{
    public string Name { get; set; }
    public int Age { get; set; }
}
class Person
{
    public string LastName { get; set; }
    public Pet[] Pets { get; set; }
}
public static void AnyEx2()
{
    List people = new List
        { new Person { LastName = "Haas",
                       Pets = new Pet[] { new Pet { Name="Barley", Age=10 },
                                          new Pet { Name="Boots", Age=14 },
                                          new Pet { Name="Whiskers", Age=6 }}},
          new Person { LastName = "Fakhouri",
                       Pets = new Pet[] { new Pet { Name = "Snowball", Age = 1}}},
          new Person { LastName = "Antebi",
                       Pets = new Pet[] { }},
          new Person { LastName = "Philips",
                       Pets = new Pet[] { new Pet { Name = "Sweetie", Age = 2},
                                          new Pet { Name = "Rover", Age = 13}} }
        };
    // 确定哪些人有非空的Pet数组。
    IEnumerable names = from person in people
                                where person.Pets.AsQueryable().Any()
                                select person.LastName;
    foreach (string name in names)
        Console.WriteLine(name);
    /* 输出结果:
       Haas
       Fakhouri
       Philips
    */
}

\n如果我使用了以下代码:\n

IEnumerable names = from person in people
                            where person.Pets.Count() > 0
                            select person.LastName;

\n它会得到相同的结果!(我不认为它是为了简短或其他什么)是否有`Any()`的特性?

0
0 Comments

为什么我应该使用Any方法而不是Count方法?

实际上,这取决于情况。

如果你的集合是以IEnumerable的形式存在的,Count()方法将会遍历所有的元素,而Any()方法则不需要这样做。所以对于可枚举对象来说,Any()方法将会有一个(潜在的)性能优势。

然而,在你的例子中,Pets是一个数组,所以你最好使用.Length而不是.Count()。在这种情况下,性能上不会有任何显著的差异。

所以,为什么要使用Any方法呢?原因就是性能。如果你知道你的集合是可枚举的,使用Any方法可以避免不必要的遍历,提高性能。而对于数组这种已知长度的集合,使用.Length属性可以更加直观和高效。

0
0 Comments

为什么应该使用Any方法而不是Count方法?

使用Any方法而不是Count方法的原因有两个。首先,根据IEnumerable<>接口后面隐藏的具体实现,Any方法可能比Count方法快得多。例如,如果实际上是LINQ-to-SQL或其他数据库提供程序,这可能意味着只需检查表中是否至少有1条记录,而不是对整个数据库进行计数。这样可以大大提高性能。

然而,更重要的原因是使用Any()比检查Count() > 0更能表达你的意图。Any()询问的是“是否有任何项?”,而不是“找出有多少项。这个数字是否大于零”。对你来说,“是否有任何项?”这个问题的自然翻译是什么?

使用Any()方法可以更好地表达你的意图,而不仅仅是计算项的数量。这对于Linq可能需要与查询提供程序一起工作的情况尤为重要,因为查询提供程序可能会将表达式转换为其他形式(如SQL),因此表达意图非常重要。Any()方法的意图可能与Count()方法完全不同。

0
0 Comments

为什么我应该使用Any方法而不是Count方法?

Any方法只检查序列是否包含至少一个元素,而Count方法需要遍历所有元素。这就是它们的区别。在以下经典场景中,使用Any方法比Count方法更好:

if (sec.Count() > 0)

if (sec.Any())

而且想象一下,如果你尝试对一个无限序列使用Count会发生什么...

同样适用于重载方法,Any方法在找到满足条件的第一个元素后就停止,而Count方法必须扫描整个序列(可能是无限的,如前所述)。

0