有清单吗?比如动态数组,它允许访问.net中的内部数组数据
本文关键字:数组 访问 net 数据 内部 许访问 单吗 动态 | 更新日期: 2023-09-27 18:11:50
查看List<T>
的源代码,似乎没有很好的方法来访问私有的_items
数组。
我需要的基本上是struct
s的动态列表,然后我可以在适当的地方修改。根据我的理解,因为c# 6还不支持ref
返回类型,所以你不能让List<T>
返回对元素的引用,这需要复制整个项目,例如:
struct A {
public int X;
}
void Foo() {
var list = new List<A> { 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<T>._items
是受保护的,至少可以创建List<T>
的子类,并创建一个具有特定修改操作的数据结构。在。net中是否有其他数据结构允许这样做,或者我必须实现我自己的动态数组?
编辑:我不想要任何形式的装箱或引入任何形式的引用语义。这段代码的目的是获得非常高的性能,我使用结构数组的原因是让它们紧密地打包在内存中(而不是堆周围的任何地方,导致缓存丢失)。
我想就地修改结构体,因为它是性能关键算法的一部分,它将一些数据存储在这些结构体中
是否有另一个数据结构在。net中允许这个,或者我必须实现我自己的动态数组?
。
在。net中没有,也不可能有这样的数据结构来避免结构复制,因为需要与c#语言进行深度集成来解决"索引getter生成复制"的问题。所以你认为直接访问数组是正确的。
但是你不必从头开始构建你自己的动态数组。许多类似List<T>
的操作,如Resize
和项目的批量移动,作为类型System.Array
的静态方法提供给您。它们有普通口味,所以不涉及拳击。
不幸的是,高性能的Buffer.BlockCopy
, 应该在任何blittable类型上工作,实际上包含对基本类型的硬编码检查,并且拒绝在任何结构上工作。
所以只要使用T[]
(加上int Count
——数组长度不够好,因为试图保持容量等于计数是非常低效的),并使用System.Array
静态方法,否则你会使用List<T>
的方法。如果您将其包装为PublicList<T>
类,则可以获得可重用性和Add
, Insert
, Sort
方法的便利性,以及通过在数组上直接索引直接访问元素。只需要进行一些约束,不要将句柄存储到内部数组中,因为下次列表需要增加其容量时,它将过时。直接访问完全可以。