C#替代VB代码

时间:2016-07-22 06:23:18

标签: c# vb.net winforms

我有这个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);
    }
    ...
}

只是想知道我做错了什么?

由于

3 个答案:

答案 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];
   }
}