我有一个列表,其中填充了用户输入的字符串。我已经检查过该字符串是否为空,并且该列表不包含该字符串。
我遇到的问题是我需要检查用户输入的字符串是否是列表中存储字符串的子字符串。
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;或类似的东西。我应该为此使用不同类型的循环吗?
答案 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
。我还尝试将列表连接成一个长字符串并在一行代码中搜索,但这很容易出现误报,因为一些单独的条目在加入时可能会形成新单词。