VB6到c#:循环或索引问题

本文关键字:索引 问题 循环 VB6 | 更新日期: 2023-09-27 18:10:11

我有一个旧的VB6项目,我正在转换为c#。我有一根绳子。我正在验证,一次一个字符,它只包含[E0-9.+-]

这是旧的VB6代码:

sepIndex = 1
Do While Mid(xyString, sepIndex, 1) Like "[E0-9.+-]"
    sepIndex = sepIndex + 1
Loop
然后,我使用索引号来计算同一字符串的,并将其转换为双精度类型。使用,然后将字符串缩短到我想要的字符串的剩余部分:
xFinal = CDbl(left(xyString, sepIndex - 1))
xyString = LTrim(right(xyString, Len(xyString) - sepIndex + 1))

这在VB中工作得很好,我没有任何问题。在c#中是不同的。知道在c#中模拟Left/Mid/Right的唯一方法是创建我自己的函数,我这样做了(我的Utils命名空间的一部分):

public static string Mid(string param, int startIndex)
   {
       try
       {
           //start at the specified index and return all characters after it
           //and assign it to a variable
           string result = param.Substring(startIndex);
           //return the result of the operation
           return result;
       }
       catch
       {
           return string.Empty;
       }
   }
public static string Right(string param, int length)
   {
       try
       {
           //start at the index based on the lenght of the sting minus
           //the specified lenght and assign it a variable
           string result = param.Substring(param.Length - length, length);
           //return the result of the operation
           return result;
       }
       catch
       {
           return string.Empty;
       }
   }
public static string Left(string param, int length)
   {
       try
       {
           //we start at 0 since we want to get the characters starting from the
           //left and with the specified lenght and assign it to a variable
           string result = param.Substring(0, length);
           //return the result of the operation
           return result;
       }
       catch
       {
           return string.Empty;
       }
   }

据我所知,我已经把代码从VB6转换成c#。问题是,当它最终设置xyString时,它在错误的位置切割字符串,并且仍然在xFinal中留下我想要的尾随字符。

根据我的收集,这可能是索引问题(我知道在c#中,子字符串是基于0的,所以我将sepIndex更改为0的值),或者错误循环结构的问题。

下面是转换后的代码,我希望我能对这里发生的事情有所了解:

sepIndex = 0;
while (Regex.IsMatch(Utils.Mid(xyString, sepIndex, 1), "[E0-9.+-]"))
{
    sepIndex++;
}
xFinal = Convert.ToDouble(Utils.Left(xyString, sepIndex - 1)); // - 1
xyString = Utils.Right(xyString, xyString.Length - sepIndex + 1).TrimStart(' '); // + 1

编辑

这个问题已经解决了。我只是从Utils中去掉了+1和-1。函数,它返回正确的字符串。

VB6到c#:循环或索引问题

似乎只是带负条件的RegEx数学- "[^E0-9.+-]":

 var sepIndex = Regex.Match(xyString, @"[^E0-9'.+-]+").Index;

如果你需要手工操作,最简单的方法是从字符串中获取单个字符,而不需要修剪:

  // replace Utils.Mid(xyString, sepIndex, 1) with
  xyString[sepIndex] 

尝试使用以下

do{
   sepIndex++;
}while (Regex.IsMatch(Utils.Mid(xyString, sepIndex, 1), "[E0-9.+-]"))

为什么不导入microsoft ?visualbasic名称空间?

class Program
{
    static void Main(string[] args)
    {
        string t = Microsoft.VisualBasic.Strings.Mid("hello", 2);
    }
}

可以重用之前的内容