是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 比较良好,我确实对返回值进行了调整。
最佳答案
它不是在做同样的事情。作业
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
class用于重复构造字符串。通常,最好使用上述 StringBuilder
翻译就地操作字符串的 VB6 代码。
也就是说,可能有一个更简单的翻译,即在第一个代码之后的意图,而不是字母。在 VB6 和 C# 中,您不会使用 InStr
后跟替换 - 您会直接使用 String.Replace
。
还要注意更改的索引(C# 和 VB.NET 是从 0 开始的,VB6 可能是从 1 开始的)。
关于c# - VB6 到 C# InsTR 函数转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17463887/