C# 合理的列表数量<;字符串>;元素?

C# 合理的列表数量<;字符串>;元素?,c#,sql,list,generics,C#,Sql,List,Generics,我知道可以添加到列表中的项目数量有限制(基本上是int.MaxValue),但在日常场景中使用的合理数量是多少?100k、500k、100万 我使用DataReader,一次向列表中添加一个字符串,然后将元素作为批处理。我想确保我没有通过使批太大而过多地限制内存。另一种方法是返回IEnumerable(非列表)并使用yield关键字。这不会为列表消耗额外内存 public IEnumerable<string> MyBigList(DataReader reader) { w

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


我使用DataReader,一次向列表中添加一个字符串,然后将元素作为批处理。我想确保我没有通过使批太大而过多地限制内存。

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

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

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

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

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

一些考虑:

  • 如果列表中的每个字符串都是一本经典小说的全文,那么100个条目肯定会带来一些问题,但是如果这个列表是一本平均长度为7-8个字符的拼写正确的单词词典,那么100k字符串应该不会是问题,因为它只是几兆字节
  • 你会有多少份名单?如果它是单个实例,则需要X字节的内存。但是,如果它是一个ASP.NET应用程序,并且您为每个用户请求创建一个
    列表
    ,那么它将以指数级增长
  • 如果您为功能强大的服务器站编写应用程序,那么多GB缓存收集可能是一个合理的解决方案,但如果您编写系统要求较低的桌面客户端应用程序,那么您就负担不起
  • 如果您进行了许多扫描操作(搜索)、添加和删除项目、保存或从文件系统加载,则每个操作都是执行
    O(N)
    操作。您可能希望根据问题更改使用的集合类型,或者使用数据库
  • 如果您一个接一个地处理项目,并且可以避免像处理集合一样使用它,那么您根本不需要
    列表
    
  • 等等
在大多数情况下,“合理数量的
列表
项目”问题没有
“这是使用
列表的合理情况吗?”
内存中的动态大小普通集合(即,
列表
)在不同的使用场景中可能有用,也可能无用,我们无法知道哪一个是您的情况(尤其是在没有代码的情况下)。

这取决于具体情况

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

一些考虑:

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

内存中的动态大小普通集合(即,
列表
)在不同的使用场景中可能有用,也可能无用,我们无法知道哪一个是您的情况(尤其是在没有代码的情况下)。

取决于您的机器以及处理它的含义。配置你的代码你有多少内存?列表中的字符串有多大?如果没有这些信息,我们怎么回答你的问题呢?答案总是取决于你的机器以及你处理它的意思。配置你的代码你有多少内存?列表中的字符串有多大?没有这些信息我们怎么回答你的问题?答案总是42