有没有办法将一个非连续的数组子集暴露为单个数组?

时间:2012-10-28 14:55:07

标签: c# arrays multidimensional-array

在我的项目中,我有一个类似于以下的类:

public class Vertices
{
    float[] vertexData1;
    int   vertexData1Offset;

    float[] vertexData2;
    int   vertexData2Offset;

    float[] vertexData3;
    int   vertexData3Offset;

    float[] vertexBuffer;

    int vertexCount;
    int vertexStride;

    public void Update()
    {
        for(int i = 0; i < vertexCount; i++)
        {
            vertexBuffer[(i * vertexStride) + vertexData1Offset] = vertexData1[i];
            vertexBuffer[(i * vertexStride) + vertexData2Offset] = vertexData2[i];
            vertexBuffer[(i * vertexStride) + vertexData3Offset] = vertexData3[i];
        }
    }
}

也就是说,我有一个数组( vertexBuffer ),这个数组是另一组数组( vertexData1 ... )的组合。只有组合数组的方式,每个'组件数组'的元素在整个'主数组'中均匀分布,所有这些都是混乱的,而不是每个数组顺序连接。

我想知道是否有办法以这种类的消费者的方式公开这些数组(例如,某种方式来子类化Array)( vertexData1 ... )可以访问它们就好像它们是具有连续元素的常规数组(包括复制到和来自),但在幕后,对象真的会在 vertexBuffer 中分发这些元素,从而消除了需求对于Update()方法和重复数据。

这在C#中是否可行?

2 个答案:

答案 0 :(得分:3)

是的,您可以使用索引器。类似的东西:

public class Vertices
{
    float[] vertexData1;
    int   vertexData1Offset;

    float[] vertexData2;
    int   vertexData2Offset;

    float[] vertexData3;
    int   vertexData3Offset;

    private float[] GetArrayForIndex(int index) {
      switch (index / vertexStride) {
        case 0: return verdexData1;
        case 1: return vertedData2;
        case 2: return vertexData3;
        default: throw new IndexOutOfRangeException();
      }
    }

    public float vertexBuffer[int index] {
      get {
        return GetArrayForIndex(index)[index % vertexStride];
      }
      set {
        GetArrayForIndex(index)[index % vertexStride] = value;
      }
    }

    int vertexStride;

}

我不确定您希望如何在索引器中排列数据。您可能希望交换/%的使用,具体取决于您是希望数组相继或交错。

答案 1 :(得分:0)

你可以实现这个[int index]的索引器并在其中提供你自己的功能:

public class Vertices
{
  public float this[int index]
  {
    get
    {
      // do your stuff here
    }
    set
    {
      // do your stuff here
    }
  }
}
相关问题