是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#中?我是一个已初始化的int。现在我确实使用返回值进行调整,如果比较好,从VB6中的0到C#中的1。
答案 0 :(得分: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
class的原因。通常,使用所述StringBuilder
来最好地转换就地操作字符串的VB6代码。
也就是说,通过在第一个代码之后追踪 intent 而不是字母,可能会有更简单的翻译。在VB6和C#中,您不会使用InStr
后跟替换 - 您将直接使用String.Replace
。
还要注意更改的索引(C#和VB.NET是基于0的,VB6可能是基于1的。)
答案 1 :(得分:-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
方法将字符数组连接到字符串。