C# ArrayList计数与任何

C# ArrayList计数与任何,c#,arraylist,any,C#,Arraylist,Any,我正在看一些遗留代码。该类使用ArrayList保存项目。这些项目是从数据库表中获取的,最多可达600万个。该类公开了一个名为“ListCount”的方法,以获取Arraylist中项目的计数 Class Settings { ArrayList settingsList ; public Settings() { settingsList = GetSettings();//Get the settings from the DB. Can also ret

我正在看一些遗留代码。该类使用ArrayList保存项目。这些项目是从数据库表中获取的,最多可达600万个。该类公开了一个名为“ListCount”的方法,以获取Arraylist中项目的计数

Class Settings
{
    ArrayList settingsList ;
    public Settings()
    {
      settingsList = GetSettings();//Get the settings from the DB. Can also return null
    }

    public int ListCount
    {
        get
        {
           if (settingsList == null )
             return 0;
           else
             return settingsList.Count;
        }
    }
}
ListCount
用于检查列表中是否有项目。我想向全班介绍“
任何
”方法

public bool Any(Func<vpSettings, bool> predicate)
{
   return settingsList !=null && settingsList.Cast<vpSettings>().Any(predicate);
}
public bool Any(Func谓词)
{
return settingsList!=null&&settingsList.Cast().Any(谓词);
}
问题是框架是否进行了某种优化并维护了项的计数,还是迭代Arraylist以获得计数?建议添加上述“任意”方法

Marc Grasser在下面的问题中建议使用任意一个用于IEnumerable


ArrayList
实现了
IList
,因此它确实有一个
Count
属性。如果您只关心检查容器(非)空性,那么使用它将比任何()更快。

ArrayList
实现了
IList
,因此它确实具有
Count
属性。如果您所关心的只是检查容器(非)空,那么使用它将比
Any()
更快。

数组列表实际上正在实现
IList
,它应该比
.Any()
更快。原因是它实现的是
Count属性
,而不是
Count方法
Count属性
应该进行快速检查,然后获取正确的属性

看起来类似于:

ICollection<TSource> collection1 = source as ICollection<TSource>;

  if (collection1 != null)
    return collection1.Count;

  ICollection collection2 = source as ICollection;

  if (collection2 != null)
    return collection2.Count;
ICollection collection1=源作为ICollection;
if(collection1!=null)
返回集合1.计数;
ICollection collection2=源作为ICollection;
if(collection2!=null)
返回集合2.计数;

数组列表实际上正在实现
IList
,它应该比
.Any()
更快。原因是它实现的是
Count属性
,而不是
Count方法
Count属性
应该进行快速检查,然后获取正确的属性

看起来类似于:

ICollection<TSource> collection1 = source as ICollection<TSource>;

  if (collection1 != null)
    return collection1.Count;

  ICollection collection2 = source as ICollection;

  if (collection2 != null)
    return collection2.Count;
ICollection collection1=源作为ICollection;
if(collection1!=null)
返回集合1.计数;
ICollection collection2=源作为ICollection;
if(collection2!=null)
返回集合2.计数;
表示ArrayList.Count返回一个缓存的私有变量

为了完整起见,这里还列出了Any()扩展方法的实现。基本上,扩展方法执行空检查,然后尝试通过IEnumerable的枚举器获取第一个元素。

表示ArrayList.Count返回缓存的私有变量


为了完整起见,这里还列出了Any()扩展方法的实现。本质上,扩展方法执行空检查,然后尝试通过IEnumerable的枚举器获取第一个元素。

Marc Gravel建议使用
Any()
覆盖
Count()
(扩展方法),但不一定覆盖
Count
(属性)

Count属性总是会更快,因为它只是查找存储在堆上的int。使用linq需要(相对)昂贵的对象分配来创建IEnumerator,再加上MoveNext中的任何开销(如果列表不为空,则在返回true之前,将不必要地将ArrayList的第一个成员的值复制到当前属性)

现在,这对于性能来说是非常微不足道的,但是执行它的代码更复杂,所以只有在有显著性能优势的情况下才应该使用它。因为实际上有一个微不足道的性能损失,我们应该选择更简单的代码。因此,我将
Any()
实现为
returncount>0


但是,您的示例正在实现任意函数的参数化重载。在这种情况下,您的解决方案(将任何扩展方法委托给参数化方法)似乎是最好的。参数化的Any扩展方法与Count属性之间没有关系。

Marc Gravel建议使用
Any()
覆盖
Count()
(扩展方法),但不一定覆盖
Count
(属性)

Count属性总是会更快,因为它只是查找存储在堆上的int。使用linq需要(相对)昂贵的对象分配来创建IEnumerator,再加上MoveNext中的任何开销(如果列表不为空,则在返回true之前,将不必要地将ArrayList的第一个成员的值复制到当前属性)

现在,这对于性能来说是非常微不足道的,但是执行它的代码更复杂,所以只有在有显著性能优势的情况下才应该使用它。因为实际上有一个微不足道的性能损失,我们应该选择更简单的代码。因此,我将
Any()
实现为
returncount>0


但是,您的示例正在实现任意函数的参数化重载。在这种情况下,您的解决方案(将任何扩展方法委托给参数化方法)似乎是最好的。参数化的Any扩展方法与Count属性之间没有关系。

能否显示
GetSettings
?例如,
IList
IDictionary
源自
ICollection
。这是增加灵活性的好处之一。
数组
的开销应该更小,速度也更快。@Greg..GetSettings()会做很多事情,并调用其他类中的方法,最终从DB中读取数据。老实说,这个方法的代码到处都是。你能显示
GetSettings
吗?例如,
IList
IDictionary
源自
ICollection
。这是它的好处之一