有清单吗?比如动态数组,它允许访问.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中允许这个,或者我必须实现我自己的动态数组?

在。net中没有,也不可能有这样的数据结构来避免结构复制,因为需要与c#语言进行深度集成来解决"索引getter生成复制"的问题。所以你认为直接访问数组是正确的。

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

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

所以只要使用T[](加上int Count——数组长度不够好,因为试图保持容量等于计数是非常低效的),并使用System.Array静态方法,否则你会使用List<T>的方法。如果您将其包装为PublicList<T>类,则可以获得可重用性和Add, Insert, Sort方法的便利性,以及通过在数组上直接索引直接访问元素。只需要进行一些约束,不要将句柄存储到内部数组中,因为下次列表需要增加其容量时,它将过时。直接访问完全可以。