我正在尝试比较C#中的两个字符串,但是我无法找到一种方法来获得我需要的结果,而无需自己构建一些东西。
字符串:
TestasdOne
TestasdTwo
结果:
Testasd
我试过linq但是无法让它工作。 我试过谷歌。
提前致谢。
答案 0 :(得分:6)
这是非linq版本,更高效,清晰和可读
public static string CommonPrefix(string a, string b)
{
if (a == null)
throw new ArgumentNullException(nameof(a));
if (b == null)
throw new ArgumentNullException(nameof(b));
var min = Math.Min(a.Length, b.Length);
var sb = new StringBuilder(min);
for (int i = 0; i < min && a[i] == b[i]; i++)
sb.Append(a[i]);
return sb.ToString();
}
像
一样使用它Console.WriteLine(CommonPrefix("TestasdOne", "TestasdTwo")); //Testasd
答案 1 :(得分:3)
使用linq你可以做到这一点。
string str1 = "TestasdOne";
string str2 = "TestasdTwo";
string similar = string.Join("", str1.TakeWhile((ch, i) => i < str2.Length && str2[i] == ch));
这将取第一个字符串的字符,而其字符等于同一索引处的第二个字符串的字符。
答案 2 :(得分:1)
解决方案可以是为LInq添加一个适用于字符串的扩展方法,以及任何IEnumerable<T>
当你觉得他们错过Linq时,这是一种快速编写的小函数。
public static class CommonPartExtension
{
public static IEnumerable<T> CommonPart<T>(this IEnumerable<T> source1,
IEnumerable<T> source2)
{
IEnumerator<T> enumerator1 = source1.GetEnumerator();
IEnumerator<T> enumerator2 = source2.GetEnumerator();
while( enumerator1.MoveNext() && enumerator2.MoveNext())
{
if ( enumerator1.Current.Equals(enumerator2.Current) )
yield return enumerator2.Current;
else
yield break ;
}
}
}
用法:
string s1 = "TestasdOne";
string s2 = "TestasdTwo";
Console.WriteLine("CommonPart " +
new String( s1.CommonPart(s2).ToArray()));
此致
答案 3 :(得分:1)
这是一个任意字符串数组的解决方案,并进行了一些优化。我不会动态编写结果,而是计算长度。
private static string GetCommonPrefix(params string[] values)
{
string result = string.Empty;
int? resultLength = null;
if (values != null)
{
if (values.Length > 1)
{
var min = values.Min(value => value.Length);
for (int charIndex = 0; charIndex < min; charIndex++)
{
for (int valueIndex = 1; valueIndex < values.Length; valueIndex++)
{
if (values[0][charIndex] != values[valueIndex][charIndex])
{
resultLength = charIndex;
break;
}
}
if (resultLength.HasValue)
{
break;
}
}
if (resultLength.HasValue &&
resultLength.Value > 0)
{
result = values[0].Substring(0, resultLength.Value);
}
}
else if (values.Length > 0)
{
result = values[0];
}
}
return result;
}