VB6到C#InsTR功能转换问题

时间:2013-07-04 07:07:05

标签: c# vb6

是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。

2 个答案:

答案 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方法将字符数组连接到字符串。