合理数量的List <string>元素?

时间:2017-03-27 05:30:28

标签: c# sql list generics

我知道可以添加到List中的项目数量有限制(基本上是int.MaxValue),但在日常场景中使用的合理数量是多少--100k,500k,100万?

我正在使用DataReader并一次向List添加一个字符串,然后将这些元素作为批处理。我希望通过使批量过大来确保我不会过多地限制内存限制。

2 个答案:

答案 0 :(得分:6)

另一种方法是返回IEnumerable(不是List)并使用yield关键字。这不会消耗列表的额外内存。

public IEnumerable<string> MyBigList(DataReader reader)
{
    while (reader.Read())
    {
       yield return (string) reader["SomeField"];
    }
}

在过去,这被称为共同例程,在C#中它被称为迭代器。有关迭代器和yield的详细信息,请参阅MSDN

处理字符串

foreach (var s in MyBigList(reader))
{
   // do something with s
}

答案 1 :(得分:1)

这取决于。

字符串数量大小背后的主要思想是默认情况下每个字符占用2个字节的内存。

一些注意事项:

  • 如果列表中的每个字符串都是经典小说的全文,那么100个项目肯定会带来一些问题,但是如果这个列表是一个平均长度为7到8个字符的正确拼写单词的字典,那么100k字符串就不应该这是一个问题,因为它只有几兆字节。
  • 你会有多少个名单?如果它是单个实例,那么它需要X个字节的内存。但是,如果它是一个ASP.NET应用程序,并且您为每个用户请求创建List,那么它将呈指数级增长。
  • 如果您为强大的服务器工作站编写应用程序,那么多GB的缓存集合可能是一个合理的解决方案,但如果您编写的系统要求较低的桌面客户端应用程序,那么您负担不起。
  • 如果您进行了许多扫描操作(搜索),添加和删除项目,保存或从文件系统加载,则每个操作都将进行O(N)操作。您可能希望根据您的问题更改已使用的集合类型或使用数据库。
  • 如果您逐个处理项目,并且可以避免像收集一样处理项目,那么您根本不需要List

在大多数情况下,&#34; List项目的合理数量是多少?#34;问题不像
那样重要 &#34;这是否合理使用List?&#34;
内存中动态大小的普通集合(即List)在不同的使用场景中可能有用或无用,我们无法知道哪一个是您的情况(特别是没有您的代码)。 / p>