是否有类似动态数组的List 允许访问.NET中的内部数组数据?

查看List的来源,似乎没有好的方法来访问私有_items项目数组。

我需要的基本上是一个动态的struct 列表 ,然后我可以在适当的位置进行修改。 根据我的理解,因为C#6还不支持ref返回类型,所以你不能让List返回对元素的引用,这需要复制整个项目,例如:

 struct A { public int X; } void Foo() { var list = new List { new A { X = 3; } }; list[0].X++; // this fails to compile, because the indexer returns a copy // a proper way to do this would be var copy = list[0]; copy.X++; list[0] = copy; var array = new A[] { new A { X = 3; } }; array[0].X++; // this works just fine } 

看看这个,从语法的角度来看,它既笨拙,也可能比修改数据要慢得多(除非JIT可以针对这个具体情况做一些神奇的优化?但我怀疑它们在一般情况下是否可以依赖,除非是特殊的标准化优化?)

现在,如果List._items受到保护,则至少可以List._items List并创建具有特定修改操作的数据结构。 .NET中是否有其他数据结构允许这样做,还是我必须实现自己的动态数组?

编辑:我不希望任何forms的拳击或引入任何forms的参考语义。 这段代码用于非常高的性能,我使用结构数组的原因是将它们紧密地打包在内存中(而不是堆在堆中,导致缓存未命中)。

我想修改结构,因为它是一个性能关键算法的一部分,它将一些数据存储在那些结构中。

.NET中是否有其他数据结构允许这样做,还是我必须实现自己的动态数组?

都不是。

.NET中没有, 也不可能是一个避免结构复制的数据结构,因为需要与C#语言进行深度集成以绕过“索引的getter复制”问题。 因此,您可以直接访问arrays。

但是您不必从头开始构建自己的动态数组。 许多List类操作(如Resize和项目的批量移动)都是作为System.Array类型的静态方法提供的。 它们有通用的味道,所以不涉及拳击。

不幸的是, 应该在任何blittable类型上工作的高性能Buffer.BlockCopy实际上包含对原始类型的硬编码检查,并拒绝在任何结构上工作。

所以只需要使用T[] (加上int Count – 数组长度不够好,因为尝试保持容量等于count非常低效)并使用System.Array静态方法,否则会使用List 。 如果将此包装为PublicList类,则可以通过直接在数组上建立索引来获得可重用性以及AddInsertSort以及直接元素访问方法的便利性。 只是执行一些约束并且永远不会将句柄存储到内部数组,因为它会在下次列表需要增加其容量时变得过时。 立即直接访问是完全正常的。