我有这个VB代码
Try
For i = 0 To OutData.NumMerids - 1
With OutData.MeridData(0)
.NumCurves = InStepFiveData.ConvexSurfaceData.MultiCurveData.NumOzCurves + InStepFiveData.ConvexSurfaceData.MultiCurveData.NumLenticularCurves
ReDim .CurveData(.NumCurves - 1)
End With
Next
...
我想生成类似的C#代码。我使用了一些逻辑并扣除了下面的代码。
try
{
for (i = 0; i <= OutData.NumMerids - 1; i++)
{
// var _with25 = OutData.MeridData[0];
OutData.MeridData[0].NumCurves =(short) (InStepFiveData.ConvexSurfaceData.MultiCurveData.NumOzCurves + InStepFiveData.ConvexSurfaceData.MultiCurveData.NumLenticularCurves);
// ERROR: Not supported in C#: ReDimStatement
Array.Resize(ref OutData.MeridData[0].CurveData, OutData.MeridData[0].NumCurves - 1);
}
...
}
只是想知道我做错了什么?
由于
答案 0 :(得分:2)
错误在于Array.Resize语句;更具体地说,给出的尺寸。
在VB.Net中,你给出数组的最后一个索引,在C#中给出数组的长度
所以两者之间的差距为1。
ReDim .CurveData(.NumCurves - 1)
' equivalent to
ReDim .CurveData(0 To .NumCurves - 1) ' length is (.NumCurves - 1) - 0 + 1 = .NumCurves
这是因为在VB6中你可以有一个在0以外的基数索引的数组(特别是1个索引的集合),所以这是有效的( 它不在VB.Net < / EM> 强>)
Dim someArray(-4 To 5) As Integer ' declares an array of 10 integer indexed from -4 to 5
回到你的代码,你只需要给出大小
//Array.Resize(ref OutData.MeridData[0].CurveData, OutData.MeridData[0].NumCurves - 1);
// replaced by
Array.Resize(ref OutData.MeridData[0].CurveData, OutData.MeridData[0].NumCurves);
至于Ashwin Nair的评论; ReDim
具有相同的行为(我不会惊讶ReDim在.Net内部使用Array.Resize)
正如戴夫所说的那样answer Array.Resize是Redim Preserve
而非Redim
的翻译(将数据擦掉)
答案 1 :(得分:2)
你(和接受的答案)让'ReDim'与'ReDim Preserve'混淆。 您的'ReDim'语句只是使用'new'语句转换来创建数组:
OutData.MeridData[0].CurveData = new Foo[OutData.MeridData[0].NumCurves];
(我不知道'CurveData'的类型,所以我使用'Foo' - 你必须用适当的类型替换。)
答案 2 :(得分:1)
您可以纠正/改进的一些事项:
C#for
循环要求您声明循环变量。
for(var i = 0; i < 100; i++) {
如果您已经在上面某处声明了i
,这可能不是问题,但如果可能的话,我建议将迭代器变量限制在循环范围内。
作为VB With
的替代,我会使用局部变量。 (我相信这是With
实际在幕后做的事情。)看起来你出于某种原因评论了这一点。每次引用OutData.MeridData[0]
或InStepFiveData.ConvexSurfaceData.MultiCurveData
时,您都必须遵循几个对象,并且取决于可能效率低下的对象的结构。此外,它很难阅读。
@Dave Doknjas得到了Redim
替换部分,你只需要使用一个构造函数。 Redim
实际上抛出旧数组并创建一个新数组,因此它的名称实际上有点误导。要Redim Preserve
,您需要使用Array.Copy
将值从旧数组移动到新数组。
try {
for (var i = 0; i <= OutData.NumMerids - 1; i++) {
var meridData = OutData.MeridData[0];
var curveData = InStepFiveData.ConvexSurfaceData.MultiCurveData;
meridData.NumCurves = (short)(curveData.NumOzCurves + curveData.NumLenticularCurves);
meridData.CurveData = new Foo[meridData.NumCurves];
}
}