转换数组 - 从VBA到C#(最佳实践)

时间:2015-08-07 14:39:35

标签: c# arrays vba

我已经将大约4000-5000行代码从VBA转换为C#。我唯一的问题是:

在VBA中,您可以创建一个类型的数组,并设置起始索引。例如:

//This creates an Array with an index 5 to index 100.
doubleArray(5 To 100) As Double

在C#中无法创建一个以0以外的索引开头的数组。(请参阅下面的链接。) 在我看来,这将留下以下两种可能性:

1。创建一个0到100的doubleArray

我可以按如下方式创建一个doubleArray:

Double[] doubleArray = new Double[100];

这有一个优点,我可以使用VBA代码中描述的索引号来设置索引。这意味着以下内容; VBA代码假定数组存在于[5]到[100],我也可以在C#中设置数字5到100。

在我看来,这是非常混乱的,因为你总是会创建带有未使用内存的数组(在这种情况下索引[0]到索引[4])。因此我想到了第二种选择。

2。创建一个从0到((topindex - bottomindex)+ 1)的doubleArray

我可以按如下方式创建一个doubleArray:

Double[] doubleArray = new Double[((topindex - bottomindex) + 1)];

在我看来,这应该是克服这个问题的“最干净”的方法,没有不必要的内存使用。在VBA中,数组使用[5]到[100],这使得长度为96.此选项的情况也是如此(((100 - 5)+ 1)= 96)。

然而,最大的缺点是,这也需要忽略已编写的所有代码。如果任何函数调用doubleArray [97],它应该是doubleArray [((97 - 5)+ 1)]。

我的问题是,如何处理这种情况?

如果其他人看到其他选项/可能性,建议非常受欢迎。

了解更多背景信息。我之前提出的问题的后续行动: Vba Type-Statement conversion to C#

2 个答案:

答案 0 :(得分:2)

三个步骤:

  1. 在VBA中围绕数组的每个实例创建单元测试。

  2. 将所有VBA阵列调整为零,检查是否符合您的单元测试。

  3. 端口到C#。

  4. 我希望避免在语言边界引入错误,因为协调问题更加困难。

答案 1 :(得分:1)

我会选择#2,但这是我想到的另一种解决方案。

你也可以做一个自定义类,里面只有一个数组。你将做3种方法:

  1. 一个用于设置元素(myObject.setElement(6,0.12))
  2. 获取一个元素(myObject.getElement(6))
  3. 第一个设置数组大小(myObject.setSize(5,100))
  4. 实际上,当您获得或设置元素时,您将转到索引(index-5)

    您可以做的课程示例

        public class CustomArray {
          private Double[] myArray;
          private int spread;
    
          public CustomArray(){
            setSize(5,100);
          }
    
          public void setSize (int lowerIndex, int upperIndex){
            myArray = new Double[(upperIndex-lowerIndex)+1]
            spread = lowerIndex
          }
    
          public Double getElement(int index){
            return myArray[index-spread];
          }
    
          public void setElement(int index, Double element){
            myArray[index-spread] = element;
          }
        }
    

    (PS:这是我在C#中编程的一年,因此可能会出现一些语法错误,但代码是为了更好地理解)