如何出于 JSON 原因将元素附加到 C# 数组?

Posted

技术标签:

【中文标题】如何出于 JSON 原因将元素附加到 C# 数组?【英文标题】:How to append an element to a C# array for JSON reasons? 【发布时间】:2021-08-28 05:56:30 【问题描述】:

我仍在研究我的 JSON 解析器和编写器。

使用 Visual Studio Web Essentials,我创建了一个类图,其中包含一些我可以放置信息的数组,例如:

public Channel[] channels  get; set; 

如您所见,这是一个没有预定义大小的数组(动态数组),现在我想在这个数组中添加一些东西,但这似乎并不那么简单:this post,称为“将值添加到C# Array”提到了如何做到这一点:

如果数组大小已知(这不是我的情况),有很多解决方案。 使用中间容器(List)....抱歉,我想避免来回复制我的数据,这看起来像是一场性能噩梦。 使用Add() 方法。我没有Add() 方法。 使用Resize() 方法。我没有Resize() 方法。 使用using System.Linq;,可以使用Append() 等方法。抱歉,using 子句存在,但我没有 Append() 方法。 做一些Enumarable...ToArray():这看起来也像来回复制数据,就像另一个性能噩梦。

我不敢相信 Web Essentials 决定使用动态数组,却没有想到一种简单的方法来操作这些数组。有人有想法吗?

特此摘录我的源代码,抛出一个 IndexOutOfRangeException:

root.<stuff>.channels[root.<stuff>.channels.Length] = new Channel();

我检查了IsFixedSize 属性:它是true 并且是只读的。

哦,我正在使用 Visual Studio Enterprise 2019,我的 .Net 目标框架似乎是 4.6.1,这似乎是最高版本,安装在我的 PC 上。

提前致谢

【问题讨论】:

使用索引操作时,Length - 1 排在最后。 这能回答你的问题吗? What is an IndexOutOfRangeException / ArgumentOutOfRangeException and how do I fix it? 没有使用过 Web Essentials...看起来您真的希望该属性成为 List&lt;Channel&gt; 而不是数组...有什么理由可以'不只是改变属性类型?即使工具生成了您开始使用的类型,我希望您能够更改它。 数组在创建时可以是动态的,但一旦创建,它们的大小是固定的。所以添加一个元素,你必须创建一个比旧数组更大的新数组。 也许使用堆栈/队列代替? 【参考方案1】:

您无法调整固定大小数组的大小。数组始终具有固定大小

这里最好的解决方案是使用List&lt;Channel&gt; 而不是Channel[]

否则你可以创建一个大小为前一个加一的新数组,并通过最后一个数组索引设置添加值,但我认为它会很脏。

这里是关于数组的 msdn 文档:Array 就是这么说的

与 System.Collections 命名空间中的类不同,Array 具有固定容量。要增加容量,您必须创建一个具有所需容量的新 Array 对象,将旧 Array 对象中的元素复制到新 Array 对象中,并删除旧 Array。

【讨论】:

感谢您的快速回复。为了自动完成这项工作,我在 Web Essentials 上开了一个新问题:github.com/madskristensen/WebEssentials2013/issues/2031。

以上是关于如何出于 JSON 原因将元素附加到 C# 数组?的主要内容,如果未能解决你的问题,请参考以下文章

迭代JSON给出字符,而不是元素

如何将列表元素的 ID 值附加到带有 .json 的链接?

如何快速将 json 附加到我的数组中

如何将数组元素附加到div?

如何在 C# 数组中附加值? [复制]

如何以及何时放弃在 C# 中使用数组?