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。函数,它返回正确的字符串。
似乎只是带负条件的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);
}
}
可以重用之前的内容