子串,搜索列表

时间:2015-05-25 05:12:04

标签: c# string list

我有一个列表,其中填充了用户输入的字符串。我已经检查过该字符串是否为空,并且该列表不包含该字符串。

我遇到的问题是我需要检查用户输入的字符串是否是列表中存储字符串的子字符串。

List<string> stringlist = new List<string>();
int index = 0;
string userinput = null;

while (userinput != "end")
{
    userinput = getstring();
    if (stringlist.Contains(userinput))
    {
        Console.WriteLine(" Term has been stored previously.");
    }
    else
    {
        stringlist.Insert(index, userinput);
        index += 1;
    }

    foreach (string s in stringlist)
    {
        Console.WriteLine("List contains : {0}", s);
        if (s.Contains(userinput))
        {
            // something?
        }
    }
} // end of main while loop

所以基本上,如果有人输入的词是&#34; dog&#34;,如果输入的其他字符串之一是#34; bigdog&#34;,它应该说&#34; dog是子串的的Bigdog&#34;或类似的东西。我应该为此使用不同类型的循环吗?

5 个答案:

答案 0 :(得分:2)

foreach (string s in stringlist)
{
    if (s.Contains(userinput))
    {
        Console.WriteLine("{0} is a substring of {1}", userinput, s);
    }
}

答案 1 :(得分:1)

stringlist.ForEach(s =>
 {
   if (s.Contains(userinput))
   {
       Console.WriteLine("{0} is a substring of {1}", userinput, s);
   }
 });

答案 2 :(得分:1)

更优化的方式。

   foreach (string s in stringlist.Where(s => s.Contains(userinput)))
          {
              Console.WriteLine("{0} is a substring of {1}", userinput, s);
          }

答案 3 :(得分:1)

stringlist.Where(s => s.Contains(userinput) || userinput.Contains(s)).ToList().ForEach(s => Console.WriteLine("Part of {0} is a substring of {1}", userinput, s));

如果您希望它不区分大小写,可以使用ToLower()

答案 4 :(得分:1)

总结每个人的建议:

  • 在将条目添加到列表之前检查子字符串
  • 使用String.Contains()方法检查列表中每个项目的子字符串
  • 使用List.Add方法,而不是使用index变量上的内存

    List<string> stringlist = new List<string>();
    string userinput = null;
    
    while (userinput != "end")
    {
    userinput = getstring();
    
    // Check for Substrings
    foreach (string s in stringlist.Where(s => s.Contains(userinput)))
    {
        Console.WriteLine("{0} is a substring of {1}", userinput, s);
    }
    
    // Add to the list
    if (stringlist.Contains(userinput))
    {
        Console.WriteLine(" Term has been stored previously.");
    }
    else
    {
        stringlist.Add(userinput);
    }
    } // end of main while loop
    

您可以使用Regex (正则表达式)类来查找列表中的匹配项,但这仍然需要foreach循环和简单的子字符串搜索{{ 1}}实际上会胜过String.Contains。我还尝试将列表连接成一个长字符串并在一行代码中搜索,但这很容易出现误报,因为一些单独的条目在加入时可能会形成新单词。