使用VB Redim Preserve等效于C#中的多维数组

时间:2017-02-28 14:46:28

标签: c#

我需要将下一个VB代码翻译成与C#相当的东西:

Dim M() As Variant, M1 As Variant, i As Long, El As Variant, k As Long
 M1 = GetAllChildrenWindowHandlesA(CLngPtr(723126), 100): k = 1
 ReDim M(1 To 3, 1 To 1)
 For i = 1 To 20
    M(1, i) = "x" & i: M(2, i) = M1: M(3, i) = i
    k = k + 1: ReDim Preserve M(1 To 3, 1 To k)
 Next i
 Debug.Print UBound(M()), LBound(M())
 ReDim Preserve M(1 To 3, 1 To k - 1)
 For Each El In M(2, 5)
    k = k - 1
    Debug.Print El, M(1, k), M(3, k)
 Next 

所以我需要能够保留三种不同变量类型(字符串,数组,整数)的东西,但是相互连接以便有可能在同一级别上识别哪个字符串对应于数组(或int)。在上述情况下,能够确定用于识别k搜索阵列的M(1,k)或M(2,k)...

提前致谢!

1 个答案:

答案 0 :(得分:0)

要创建一个基于1的3x20对象矩阵,可以这样做:

Object[,] M = (Object[,]) Array.CreateInstance(typeof(Object), new int[]{3,20}, new int[]{1,1});

据我所知,C#中没有一种简单的方法可以为多维数组复制ReDim Preserve。我认为你每次都必须创建一个新的数组,并使用Array.Copy方法复制元素。话虽如此,我相信你最好使用A_J的List<>结构或类别的建议:

struct MData
{
  public string M1;
  public IntPtr[] M2;
  public int M3;
}

然后是这样的:

        IntPtr[] childHandles = GetAllChildrenWindowHandlesA(new IntPtr(723126),100);

        List<MData> M = new List<MData>();
        for (int i = 0; i < childHandles.Length; i++)
        {
            M.Add(new MData() { 
                  M1 = "x" + i.ToString()
                , M2 = childHandles 
                , M3 = i
            });
        }