在C#中,使用List <T>时,是否可以缓存Count属性,或者属性是否足够快?

Ste*_*uer 10 c#

换句话说,如果有的话,下列哪一项会更快?

List<MyClass> myList;
...
...
foreach (Whatever whatever in SomeOtherLongList)
{
  ...
  if (i < myList.Count)
  {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

要么

List<MyClass> myList;
...
...
int listCount = myList.Count;
foreach (Whatever whatever in SomeOtherLongList)
{
  ...
  if (i < listCount)
  {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

Ste*_*vds 17

Count只是一个整数.当你问它的价值时,它不会被计算出来.它是'预先计算'所以它是一样的.选项1更具可读性:)

  • @Rob:每次在循环中调用时都会执行`Count`**.只是`Count`属性只需返回内部字段的值,而不是每次调用时都执行计算等.(抖动也很可能会内联访问`Count`属性,从而进一步提高性能.) (2认同)

Bri*_*sen 13

因为List<T>它实际上没有必要缓存它,因为它只是一个简单的属性.

但是,Count()可以在any上使用的扩展方法可能IEnumerable非常昂贵,因为它可能需要枚举整个序列以便对其进行计数(对于列表,它只使用属性,但枚举其他任何内容).此外,如果您只需要知道count是否为零,Any()则首选扩展方法.