为什么我无法使用索引器将项目添加到通用列表?

2023-11-22

这是我今天看到的一个奇怪的情况:

我有一个通用列表,我想使用它的索引器将项目添加到我的列表中,如下所示:

List<string> myList = new List<string>(10);
myList[0] = "bla bla bla...";

当我尝试这个时,我得到了ArgumentOutOfRangeException

enter image description here

然后我看了看List<T>索引器设置方法,如下:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries"),    __DynamicallyInvokable] 
  set
  {
    if ((uint) index >= (uint) this._size)  
      ThrowHelper.ThrowArgumentOutOfRangeException();  //here is exception
    this._items[index] = value;
    ++this._version;
  }

并且还看了Add method:

[__DynamicallyInvokable]
public void Add(T item)
{
  if (this._size == this._items.Length)
    this.EnsureCapacity(this._size + 1);
  this._items[this._size++] = item;
  ++this._version;
}

现在,正如我所见,这两种方法都使用相同的方式:

// Add() Method
this._items[this._size++] = item; 
// Setter method
this._items[index] = value;

The _items是一个类型的数组T :

private T[] _items;

并且在构造函数中_items像这样初始化:

this._items = new T[capacity]

现在,在完成所有这些之后,我很好奇为什么我无法使用索引将项目添加到我的列表中
,虽然我明确指定列表容量?


原因是你不add到带有索引器的列表,您替换现有项目.

由于您尚未向列表添加任何项目,因此它是空的,并且任何使用索引器向其中“添加”项目的尝试都会引发该异常。

This:

new List<string>(11);

不会创建一个包含 11 个元素的列表,它会创建一个最初容量为 11 个元素的列表。这是一个优化。如果添加更多元素,则必须在内部调整列表的大小,并且您可以传入预期或已知的容量以避免过多的调整大小。

这是一个LINQPad程序演示:

void Main()
{
    var l = new List<string>(10);
    l.Dump(); // empty list

    l.Add("Item");
    l.Dump(); // one item

    l[0] = "Other item";
    l.Dump(); // still one item

    l.Capacity.Dump(); // should be 10
    l.AddRange(Enumerable.Range(1, 20).Select(idx => idx.ToString()));
    l.Capacity.Dump(); // should be 21 or more
}

Output:

output of linqpad program


内部结构

在内部,在一个List<T>,数组实际上是用来保存元素的。另外,一个Count保留属性/值以跟踪实际使用了多少个数组元素。

当您构造一个空列表时,不传入容量,则使用默认列表,这就是该数组的初始大小。

当您不断向列表中添加新元素时,您将慢慢地填满该数组,直到最后。一旦填充了整个数组,并向其中添加另一个元素,就必须构造一个新的、更大的数组。然后,旧数组中的所有元素都会复制到这个更大的新数组中,从现在开始,将使用该数组。

这就是内部代码调用它的原因EnsureCapacity方法。如果需要,此方法是执行调整大小操作的方法。

每次需要调整数组大小时,都会构造一个新数组并复制所有元素。随着阵列的增长,此操作的成本也会增加。它不是all这么多,但它仍然不是免费的。

这就是为什么,如果您知道需要在列表中存储(例如)1000 个元素,那么最好首先传入一个容量值。这样,该数组的初始大小可能足够大,永远不需要调整大小/替换。同时,仅传递非常大的容量值也不是一个好主意,因为这可能最终会使用大量不必要的内存。

还要知道,答案的这一部分中的所有内容都是未记录的(据我所知)行为,并且您可能从中学到的任何细节或特定行为都不应影响您编写的代码,除了有关传递良好的知识之外容量值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我无法使用索引器将项目添加到通用列表? 的相关文章

  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 如何从另一个数组值中过滤数组值并返回新数组? [复制]

    这个问题在这里已经有答案了 我有两个数组 all languages and taken languages 第一个包含所有语言 例如 200 种或其他语言 第二个包含之前选择的语言 从 0 到 200 种 我需要删除所有已采用的语言 ta
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 2 使用我的代码在数组中查询

    我使用滑块来显示我的 WordPress 精选文章 它选择一个自定义类别并返回一定数量的帖子 如何将显示的第一篇帖子设为自定义帖子 我可以直接在滑块代码中添加特定帖子的 ID吗使该帖子首先出现 然后是原始查询返回的其他内容 例如 在页面上
  • 条件类型定义

    如果我有一小段这样的代码 template
  • PHP-如何根据条件配对数组中的项目

    如何将数组中的项目配对 假设我有一个数组Fighters 我想根据他们的情况将他们配对Weights 体重最接近的拳手应作为配对最佳匹配 但如果他们是在同一个团队中 他们不应该配对 团队 1 战斗机A体重为60 战斗机B体重为65 2队 战
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • PHP 中根据相似值对数组进行分组

    我有一个具有以下结构的数组
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其

随机推荐

  • 在 JavaScript 函数中使用三元运算符

    我是 Javascript 新手 正在努力解决这些三元运算符的问题 我有这个小代码段 const x MSys inShip ship launch if x send command x 虽然这工作效率足够高 但我很好奇是否可以在函数调用
  • 画布扭曲绘图。如何获得设置尺寸和样式尺寸之间的比例因子?

    我有这个画布
  • 在Python中转义html?

    我有一个 img src string but string可能包含 我该怎么做才能逃脱它 Example string test jpg img src test 不起作用 在Python 3 2中一个新的html引入了模块 该模块用于从
  • n 位整数的平方与两个 n 位整数的乘法

    免责声明 家庭作业问题 我正在寻找提示 F Lake 教授告诉他的班级 对 n 位整数进行平方比对两个 n 位整数进行乘法渐近更快 他们应该相信他吗 我相信通过移位 加法将两个 n 位整数相乘是一个 O n 操作 但我不明白为什么对一个 n
  • 使用 CSS 和 IE 旋转文本

    我需要用 CSS 旋转文本 我有以下样式规则 但它们似乎不适用于 Internet Explorer footer descr span moz transform rotate 20deg Firefox o transform rota
  • matplotlib:以 None 作为值绘制 numpy 数组

    我有一个看起来像这样的数组 k numpy array 1 0 001 1 1 0 002 None None 1 2 0 003 0 99 0 004 我想绘制不是的值 None None 并保留数组值的索引 也就是说 只要有间隙 我就想
  • Go中如何实现策略模式?

    这是我试图解决的一般问题 一组包从一个源收集数据并将其发送到多个通道 第二组包从多个通道收集数据并将其写入一个源 这组包需要转换多种格式的数据 这似乎是策略模式的完美案例 但我不确定如何最好地使其在 Go 中发挥作用 一般来说 不要迷失在构
  • 如何在 Jenkinsfile 中获取 shell 脚本的输出?

    在 Jenkinsfile Groovy 脚本阶段 假设我想发出一个 linux 命令来输出字符串的行和列 并且想要获取某一行的输出中的第 n 列 此类命令的一个示例是 ls al 那我这样做对吗 stage Get dir size sh
  • 如何使用 CSS 将图像大小调整为其自身的百分比?

    我正在尝试使用图像本身的百分比来调整图像的大小 例如 我只想将图像大小调整为 50 将图像缩小一半 但申请width 50 会将图像大小调整为容器元素 可能是父元素 的 50 例如 问题是 我可以在不使用 JavaScript 或服务器端的
  • 如何使用 micrometer-brave 在 spring-cloud-gateway 中获取trace-id

    我想在 Spring Cloud Gateway 中的每个请求的日志中显示traceId 然而 traceId和spanId只是空的 日志配置如下 logging pattern level 5p TRACE ID X traceId SP
  • ServiceStack.Redis:无法连接:sPort:0

    有时 并非总是 我得到 无法连接 sPort 0 使用 ServiceStack Redis 时尝试从 Redis 获取值时出错 有谁知道这可能意味着什么 我正在使用 PooledRedisClientManager 来获取客户端 我相信你
  • Firebase 3.0 令牌:[错误:Firebase Auth ID 令牌没有“kid”声明]

    我目前正在使用 firebase 3 0 开发一个 node js 服务 该服务由使用 firebase 2 4 的 Web 应用程序调用 我正在发送当前用户Firebase ID 令牌 Auth getAuth token 在我的标头调用
  • ng14 中具有强类型表单的 FormBuilder

    我有以下表格 const enum Fields FirstName firstName LastName lastName interface FormType Fields FirstName FormControl
  • 检索安全描述符并获取 FileSystemRights 编号

    Using Get Acl我正在尝试获取文件夹的访问权限 问题是 对于某些组 我得到的是号码而不是访问类型 下面的例子 get acl C TestFolder access FileSystemRights 536805376 Acces
  • Laravel 5.6 getRouteKeyName() 不起作用

    这是我到目前为止的代码 Web php Route get uri PageController show gt name page show 页面控制器 Show the requested page public function sh
  • 将 .jar 转换为 OSX 可执行文件?

    我制作了一个 Java 应用程序 我想在 Windows OSX 和 Linux 上分发它 而不分发 jar 文件 我使用了很棒的 Windows exe 包装器http launch4j sourceforge net 创建一个包含我的图
  • Android ListView 具有多种布局

    我必须显示具有不同类型视图的列表 所以我必须定义一个带有适配器的 ListView 我必须在其中扩展多个视图 我已经经历过example给定 但问题是我的列表不对称 就像示例中每次在 4 个项目后重复标题一样 所以我面临着重复使用物品的问题
  • 如何在跨文件预处理时获取唯一值

    PROBLEM 我需要一种使用预处理器指令生成唯一值的方法 目的是每次调用宏时 它都会有一个唯一的integral标识符 但它应该在文件中保留其价值 有点像预处理器计数器 用于记录调用函数的次数 更多信息 我使用的宏是 define LOG
  • 使用通用可选参数的 Typescript 函数重载

    我正在尝试编写一个高阶函数来包装输入函数并缓存最近调用的结果作为副作用 基本功能 withCache 看起来像这样 function cache key string value any Some caching logic goes he
  • 为什么我无法使用索引器将项目添加到通用列表?

    这是我今天看到的一个奇怪的情况 我有一个通用列表 我想使用它的索引器将项目添加到我的列表中 如下所示 List