说我有两个字符串:
"SomeTextHereThatIsTheSource"
"SomeTextHereThatIsCloseToTheSourceButNotTheSame"
是否有一种灵巧的.net方式来了解文本的哪一部分是相同的(从头开始)。
所以在这个例子中结果是:
"SomeTextHereThatIs"
答案 0 :(得分:3)
你可以使用TakeWhile:
string MatchFromStart(string s1, string s2)
{
if (s1 == null || s2 == null) return "";
var matchingArray = s1.TakeWhile((c, i) => { return i < s2.Length && c == s2[i]; });
return String.Join("", matchingArray);
}
然后使用它:
string s1 = "SomeTextHereThatIsTheSource";
string s2 = "SomeTextHereThat";
string s3 = "SomeTextHereThatIsCloseToTheSourceButNotTheSame";
Console.WriteLine(MatchFromStart(s1, s2)); // SomeTextHereThat
Console.WriteLine(MatchFromStart(s2, s1)); // SomeTextHereThat
Console.WriteLine(MatchFromStart(s3, s1)); // SomeTextHereThatIs
Console.WriteLine(MatchFromStart("", s1)); // (blank string)
Console.WriteLine(MatchFromStart(s3, "")); // (blank string)
Console.WriteLine(MatchFromStart(null, s1)); // (blank string)
Console.WriteLine(MatchFromStart(s2, null)); // (blank string)
答案 1 :(得分:2)
我会在较短的字符串上说for
循环,逐个字符地比较是最好的选择。它也可能是最快的。
// str1 is shorter or equal in length to str2:
for(int i=0; i < str1.Length; i++)
{
if(str1[i] == str2[i])
continue;
return i;
}
答案 2 :(得分:0)
使用简单的while循环来确定匹配的长度:
int len = 0;
while (len < s1.Length && len < s2.Length && s1[len] == s2[len]) {
len++;
}
如果您事先确定两个字符串的最小长度,可以稍微改进一下
int minLength = Math.Min(s1.Length, s2.Length);
int len = 0;
while (len < minLength && s1[len] == s2[len]) {
len++;
}
答案 3 :(得分:0)
虽然它可能不是最优化的,但这是一个非常干净的方法来利用string
也是IEnumerable<char>
的事实。
static string CommonPrefix(string string1, string string2) {
var length = Enumerable.Zip(string1, string2, (a, b) => a == b).TakeWhile(a => a).Count();
return string1.Substring(0, length);
}