我有一些像这样的字符串: str1 = STA001,str2 = STA002,str3 = STA003 并有代码来比较字符串:
private bool IsSubstring(string strChild, string strParent)
{
if (!strParent.Contains(strChild))
{
return false;
}
else return true;
}
如果我有strChild = STA001STA002和strParent = STA001STA002STA003然后返回true但是当我输入strChild = STA001STA003并检查strParent = STA001STA002STA003然后返回false,尽管STA001STA003包含在strParent中。我该如何解决?
答案 0 :(得分:4)
您所描述的不是子串。它基本上要求两个集合的问题是“这是另一个a subset的问题吗?”当集合a set(例如HashSet<T>
)比集合是一个大的连接字符串时,这个问题要容易得多。
这是编写代码的更好方法:
var setOne = new HashSet<string> { "STA001", "STA003" };
var setTwo = new HashSet<string> { "STA001", "STA002", "STA003" };
Console.WriteLine(setOne.IsSubsetOf(setTwo)); // True
Console.WriteLine(setTwo.IsSubsetOf(setOne)); // False
或者,如果STA00
部分只是填充以使其在字符串的上下文中有意义,那么直接使用int
:
var setOne = new HashSet<int> { 1, 3 };
var setTwo = new HashSet<int> { 1, 2, 3 };
Console.WriteLine(setOne.IsSubsetOf(setTwo)); // True
Console.WriteLine(setTwo.IsSubsetOf(setOne)); // False
答案 1 :(得分:0)
Contains
方法只查找完全匹配,它不会查找字符串的部分内容。
将子字符串划分为其部分,并查找父字符串中的每个部分:
private bool IsSubstring(string child, string parent) {
for (int i = 0; i < child.Length; i+= 6) {
if (!parent.Contains(child.Substring(i, 6))) {
return false;
}
}
return true;
}
但是,您应该考虑跨部件匹配是否可行,如果这是一个问题。例如。在"1STA00"
中寻找"STA001STA002"
。如果这是一个问题,那么你应该类似地划分父字符串,并且只在部分之间进行直接比较,而不是使用Contains
方法。
注意:在C#中不鼓励使用匈牙利表示法来表示变量的数据类型。
答案 2 :(得分:0)
这可能有点过分,但可能会非常有益。
private static bool ContainedWord(string input, string phrase)
{
var pattern = String.Format(@"\b({0})", phrase);
var result = Regex.Match(input, pattern);
if(string.Compare(result, phrase) == 0)
return true;
return false;
}
如果表达式找到匹配项,则将结果与您的短语进行比较。如果它们为零,则匹配。我可能会误解你的意图。