1

VB6コードです

i = InStr(1, strText, "Mc", CompareMethod.Binary)
    If (i <> 0) And (i + 2 <= lngLength) Then Mid(strText, i + 2, 1) = UCase(Mid(strText, i + 2, 1))

と同じことをする

i = strText.IndexOf("Mc");
    if ((i != 1) && (i + 2 <= lngLength))
    {
        strText = strText.Substring(i + 2, 1);
        strText = strText.ToUpper();            
    }

C#で?i は初期化された int です。ここで、VB6 の 0 から C# の 1 までの比較が適切であれば、戻り値を調整しました。

4

2 に答える 2

3

同じことをしているわけではありません。課題

Mid(strText, i + 2, 1) = UCase(Mid(strText, i + 2, 1))

文字列内のその部分(つまり の 1 文字)のみを置き換え、残りはそのままにします。i+2C# コードは残りの文字列を破棄します。

.NET 文字列は不変であるため、このアプローチを直接変換することはできません。

最も近い翻訳は、文字列を明示的に構築することです。つまり、

strText = strText.Substring(0, i + 1) +
    strText.Substring(i + 2, 1).ToUpper() +
    strText.Substring(i + 3);

ただし、これをループ内で何度も行うのは非常に非効率的です。そのため、.NET では、文字列を繰り返し作成するためのStringBuilderクラスが提供されています。一般に、文字列をその場で操作する VB6 コードは、 said を使用して変換するのが最適StringBuilderです。

とはいえ、文字ではなく、最初のコードの後に​​意図をたどることで、おそらくより簡単な翻訳があるでしょう。VB6 と C# の両方で、 のInStr後に置換を使用せず、 を直接使用しますString.Replace

また、変更されたインデックスにも注意してください (C# と VB.NET は 0 ベース、VB6 は 1 ベースの可能性があります)。

于 2013-07-04T07:14:10.833 に答える