比较字符串是否相等

时间:2015-06-02 15:00:18

标签: c# string compare string-comparison

我想比较一组字符串并返回相等的部分,直到出现不相等的部分。 (并删除traling whitespace)。

示例:

List<string> strList = new List<string>
{
    "string xyz stop",
    "string abc stop",
    "string   qrt stop"
};

string result = GetEqualName(strList); // This should return "string"

我制作了以下方法

string GetEqualName(IEnumerable<string> strList)
{
    string outString = "";
    bool firstTime = true;
    foreach (var subString in strList)
    {
        if (firstTime)
        {
            outString = subString;
            firstTime = false;
        }
        else
        {
            string stringBuilder = "";
            for (int i = 0; i < outString.Count(); i++)
            {
                if (outString[i] == subString[i])
                    stringBuilder = stringBuilder + outString[i];
                else
                    break;
            }
            outString = stringBuilder;
        }
    }
    outString = outString.TrimEnd(' '); // Remove traling whitespace
    return outString;
}

我只是觉得这可以在几行中完成,而且我过度了。你们有什么建议吗?

4 个答案:

答案 0 :(得分:6)

你可以Zip两个字符串在一起,取相同的对,然后创建这些字符的字符串。

public static string LargestCommonPrefix(string first, string second)
{
    return new string(first.Zip(second, Tuple.Create)
        .TakeWhile(pair => pair.Item1 == pair.Item2)
        .Select(pair => pair.Item1)
        .ToArray());
}

一旦解决了组合两个字符串的问题,您就可以轻松地将其应用于一系列字符串:

public static string LargestCommonPrefix(IEnumerable<string> strings)
{
    return strings.Aggregate(LargestCommonPrefix);
}

答案 1 :(得分:2)

这个小功能与您的版本基本相同,但更短。

string GetEqualName(IEnumerable<string> strList)
{
    int limit = strList.Min(s => s.Length);

    int i = 0;
    for (; i < limit; i++)
    {
        if (strList.Select(s => s.Substring(0,i+1)).Distinct().Count() > 1)
        {
            break;
        }
    }
    return strList.First().Substring(0, i).Trim();
}

答案 2 :(得分:1)

这是一种不同的方法,可以满足您的需求。我使用HashSet<string>

从左到右查找最长的公共子字符串
string GetCommonStartsWith(IEnumerable<string> strList, StringComparer comparer = null)
{
    if(!strList.Any() || strList.Any(str => string.IsNullOrEmpty(str)))
        return null;
    if(!strList.Skip(1).Any())
        return strList.First(); // only one

    if(comparer == null) comparer = StringComparer.CurrentCulture;
    int commonLength = strList.Min(str => str.Length);

    for (int length = commonLength; length > 0; length--)
    {
        HashSet<string> duptester = new HashSet<string>(comparer);
        string first = strList.First().Substring(0, length).TrimEnd();
        duptester.Add(first);
        bool allEqual = strList.Skip(1)
            .All(str => !duptester.Add(str.Substring(0, length).TrimEnd()));
        if (allEqual)
            return first;
    }
    return null;
}

答案 3 :(得分:1)

这是一个使用较少LINQ而不是其他一些答案的版本,可能性能更高。

string GetEqualName(IEnumerable<string> strList)
{
    StringBuilder builder = new StringBuilder();
    int minLength = strList.Min(s => s.Length);

    for (int i = 0; i < minLength; i++)
    {
        char? c = null;
        foreach (var s in strList)
        {
            if (c == null)
                c = s[i];
            else if (s[i] != c)
                return builder.ToString().TrimEnd();
        }
        builder.Append(c);
    }
    return builder.ToString().TrimEnd();
}