我已经将大约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#
答案 0 :(得分:2)
三个步骤:
在VBA中围绕数组的每个实例创建单元测试。
将所有VBA阵列调整为零,检查是否符合您的单元测试。
端口到C#。
我希望避免在语言边界引入错误,因为协调问题更加困难。
答案 1 :(得分:1)
我会选择#2,但这是我想到的另一种解决方案。
你也可以做一个自定义类,里面只有一个数组。你将做3种方法:
实际上,当您获得或设置元素时,您将转到索引(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#中编程的一年,因此可能会出现一些语法错误,但代码是为了更好地理解)