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))

仅替换字符串中的那部分(即 处的单个字符i+2),其余部分保持不变。您的 C# 代码会丢弃字符串的其余部分。

由于 .NET 字符串是不可变的,因此这种方法不能直接翻译。

最接近的翻译是显式构造字符串,即做

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

然而,在循环中做很多这样的事情是非常低效的,这就是为什么 .NET 提供了用于重复构造字符串的StringBuilder类。通常,就地操作字符串的 VB6 代码最好使用所述StringBuilder.

也就是说,通过在第一个代码之后而不是字母之后的意图,可能会有更简单的翻译。在 VB6 和 C# 中,您不会使用InStr后跟替换 - 您将直接使用String.Replace.

还要注意更改的索引(C# 和 VB.NET 是从 0 开始的,VB6 可能是从 1 开始的)。

于 2013-07-04T07:14:10.833 回答
-1
StringBuilder strText = new StringBuilder("Mcdonald");
int lngLength = strText.Length;
int i = strText.ToString().IndexOf("Mc");
if ((i != 1) && (i + 2 <= lngLength))
{
    strText[i + 2] = char.ToUpper(strText[i + 2]);
}
Console.WriteLine(strText.ToString()); // prints McDonald

编辑:基本上,您不必在找到字符的位置之前/之后获取字符串并对其进行连接。StringBuilder有助于就地修改内容(字符串作为字符数组),并且该ToString方法将字符数组连接到字符串。

于 2013-07-04T07:24:16.747 回答