子串、列表搜索

3

我有一个列表,里面填充着用户输入的字符串。我已经检查过这个字符串不是空的,并且这个列表中也不包含这个字符串。

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

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

基本上,如果某人输入的一个词是“dog”,如果其中一个其他字符串输入的是“bigdog”,那么它应该说“dog是bigdog的子字符串”或类似的内容。我需要使用不同类型的循环吗?


1
一个类似上面的foreach循环就可以了。如果你正在使用列表并且想要更快一点,可以使用for循环。无论哪种方式都可以。另外,当向列表添加数据时,只需使用List.Add而不是List.Insert,除非您需要在特定索引中插入数据。目前,您正在做基本上与List.Add相同的事情。 - deathismyfriend
你可以使用正则表达式来查找匹配字符串,无需循环遍历每个单词!或者,你可以通过字符串的Contains方法来检索是否包含另一个字符串。参考:http://www.dotnetperls.com/regex-match - Behzad
说实话,我不确定,这个特定的练习任务措辞有些奇怪。 "如果该术语是存储术语的子字符串,则应显示存储的术语"。 我的理解是,当用户输入一个字符串时,将检查整个列表,以查看该字符串是否是列表中任何存储字符串的子字符串。 - iskelz
2
在将用户输入添加到列表之前,请进行子字符串检查。否则它总是为真。 - Arun Raj
如果列表中包含“dog”,用户输入“bigdog”会怎样? - HadiRj
5个回答

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

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

1
更优化的方法。
   foreach (string s in stringlist.Where(s => s.Contains(userinput)))
          {
              Console.WriteLine("{0} is a substring of {1}", userinput, s);
          }

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()

1
总结大家的建议如下:

  • Check for substrings before adding the entry to the list
  • Use String.Contains() method to check for sub-strings on each item in the list
  • Use the List.Add method rather then using memory on an index variable

    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 循环。对于简单的子字符串搜索,String.Contains 实际上比 Regex.IsMatch 更快。我还尝试将列表连接为一个长字符串并在其中搜索一行代码,但这很容易产生误报,因为某些单独的条目可能会在连接时形成新单词。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接