比较字符串但没有效果

时间:2016-12-14 09:05:10

标签: c# string

所以我有一个终端列表: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

为什么不平等? 有什么建议吗?

2 个答案:

答案 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