所以我有一个终端列表:a,b,c,d
我有像
这样的作品 A > aA | cC |a
我试图检查生产A的一部分是否是终端,或者该部分是否存在于终端列表中。问题是,当我比较两个部分时,结果总是错误的。我尝试过" Equals","包含"和" =="结果是一样的,我不知道为什么。
我的代码来自我分割生产并比较两部分:
foreach (Production production in productions)
{
String prod = production.ToString();
String[] right = prod.Trim().Split('>');
String justRightPart = right[1];
String[] separate = justRightPart.Trim().Split('|');
Boolean ok = true;
foreach (String s in separate)
{
foreach(string terminal in terminals)
{
Console.WriteLine("Terminal: " + terminal + " string part is " +s);
Boolean bool = terminal.Contains(s) || (terminal == s);
Console.WriteLine("bool : " + bool);
}
}
}
并且bool总是假的,即使它说:
Terminal a string part is a
为什么不平等? 有什么建议吗?
答案 0 :(得分:0)
s
中的空格可能不在terminal
中,反之亦然。尝试在字符串打印周围添加单引号,例如:
Console.WriteLine("Terminal: '" + terminal + "' string part is '" + s + "'");
如果使用位置参数重写打印件可能会更清楚,例如:
Console.WriteLine("Terminal: '{0}' string part is '{1}'", terminal, s);
答案 1 :(得分:0)
我建议使用 Linq ,例如
List<String> terminals = new List<string>() { "a", "b", "c" };
string source = "A > aA | cC | a";
var hasTerminal = source
.Substring(source.IndexOf('>') + 1) // at the right of ">"
.Split('|') // split to parts
.Select(part => part.Trim()) // trim each part (leading/trailing white spaces)
.Any(part => terminals.Contains(part)); // ... if part exists in list of terminals
您可能还希望实现调试报告 / log:
var report = source
.Substring(source.IndexOf('>') + 1)
.Split('|')
.Select(part => part.Trim())
.Select(part => $"{part,4} is {(terminals.Contains(part) ? "a term" : "NOT a term")}");
Console.Write(string.Join(Environment.NewLine, report));
结果是
aA is NOT a term
cC is NOT a term
a is a term