我正在将C ++应用转换为C#,并且在许多地方使用AnsiCompare
来比较两个字符串。这会返回一个整数,所以整个代码都有这样的东西:
if (str.AnsiCompare("value") == 0 || str2.AnsiCompare("val") != 0)
我刚刚在AnsiCompare
上执行了查找和替换,并将其与Equals
切换,但由于您无法隐式地将bool
转换为int
C#我必须手动完成并删除所有比较为0。
相反,我试图编写一个应用程序,并逐行解析,如下所示:
List<int> lineIndices = new List<int>();
int lineIndex = 0;
foreach(var line in lines)
{
int index = line.IndexOf("Equals(\"");
if (index > 0)
lineIndices.Add(lineIndex)
}
for (int i = lineIndices.Count; i >= 0; i--)
{
lines[lineIndices[i]].Replace(" == 0", String.Empty);
}
我还没有真正测试过它,但基本的想法是遍历每一行,看看它是否呼叫&#34;等于&#34;并将该行号添加到行号列表中。然后循环回来(不确定我是否真的需要反向进行,但我认为这并不重要)并将所有等同于零的&#39;与空string
进行比较。由于Equals
返回bool
,因此相当简单。但是,与!= 0
比较时,我不知道如何找到代码段的开头来为感叹号添加前缀。
我知道有String.IndexOf(string, int32, int32)
来搜索从给定位置开始的值以及一定数量的位置来检查,但我需要相反。从一个位置开始并向后检查一个空格,然后用空格+感叹号替换该空格?
我想我可以从一开始就开始使用LastIndexOf
来查找"Equals"
索引之前的最后一个空格,但这并不能解决那些不合适的情况。有一个空格,例如if (someStr.Equals("val") != 0)
。然后我会在(
之前获得空格。
我怎样才能做到这一点?
答案 0 :(得分:2)
Visual Studio&#39;查找和替换&#39;使用正则表达式的工具&#39;对于这样的任务是完美的。
例如,要将每个stringVariable.AnsiCompare(stringLiteral) == 0
替换为stringVariable == stringLiteral
,您可以使用以下正则表达式:
(?<str>[a-zA-Z0-9]*)\.AnsiCompare\((?<compareWith>"[^"]*")\) == 0
并替换为
${str} == ${compareWith}
答案 1 :(得分:1)
我会使用RegEx
将str.AnsiCompare("value")
替换为string.Compare(str, "value")
答案 2 :(得分:0)
或者,您可以编写扩展方法,只需添加使用而不是所有替换
public static int AnsiComapre(this string x, string y)
{
return String.Compare(x, y);
}