得到两个字符串的公共前缀

时间:2015-11-14 13:55:44

标签: c# .net string linq comparison

我正在尝试比较C#中的两个字符串,但是我无法找到一种方法来获得我需要的结果,而无需自己构建一些东西。

字符串:

  

TestasdOne
  TestasdTwo

结果:

  

Testasd

我试过linq但是无法让它工作。 我试过谷歌。

提前致谢。

4 个答案:

答案 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;
    }