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

问题描述 投票:3回答:4

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

字符串:

TestasdOne TestasdTwo

结果:

Testasd

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

提前致谢。

c# .net string linq comparison
4个回答
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

3
投票

使用linq你可以做到这一点。

string str1 = "TestasdOne";
string str2 = "TestasdTwo";

string similar = string.Join("", str1.TakeWhile((ch, i) => i < str2.Length && str2[i] == ch));

这将取第一个字符串的字符,而其字符等于同一索引处的第二个字符串的字符。


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()));

问候


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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.