如何从列表中删除类似的字符串?

时间:2016-06-14 16:33:47

标签: c# string list

从列表中删除类似字符串的有效方法是什么?

考虑由这些(和其他)字符串组成的List<string>

  

“SRS INVESTMENT MANAGEMENT,LLC”

     

“SRS投资管理”

     

“Maplelane Capital,Ltd。”

     

“Maplelane Capital,Limited”

所以我需要做的是删除“足够相似”的字符串。我的想法是,这应该通过大写列表的所有字符串来完成,然后删除除了另一个字符串的最后X个字符之外的所有字符串。最后,我希望这给我留下一个列表,其中只包含一个字符串,用于他们实际代表的每个真实公司。

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:2)

您可以首先创建一个例程,用完整的单词替换明显的缩写,然后删除空格。好消息是,公司对公司名称有严格的规定。例如,您不能拥有一家名为&B; B&amp; B的公司。 C Ltd&#39;,如果&#39; Band C Ltd&#39;已经存在。 之后,您将需要开始考虑匹配算法,例如Levenshteins和Soundex。

答案 1 :(得分:1)

我建议你创建一个IEqualityComparer来封装逻辑,以确定两个字符串是否相等。

一个例子,如果你想混合和匹配SoundEx和Levenshtein可能类似

public class CompanyNameComparer : IEqualityComparer<string>
{

    public bool Equals(string x, string y)
    {
        if (x == null && y == null)
        {
            return true;
        }
        if (x == null || y == null)
        {
            return false;
        }

        var src1 = FormatString(x);
        var src2 = FormatString(y);

        if (src1 == src2)
        {
            return true;
        }

        var difference = CalcLevenshteinDistance(src1, src2);

        // arbitrary number you will need to find what works
        return difference < 7;
    }

    private string FormatString(string source)
    {
        return source.Trim().ToUpper();
    }

    // code taken from http://stackoverflow.com/a/9453762/1798889
    private int CalcLevenshteinDistance(string a, string b)
    {
       // code not included 
    }

    public int GetHashCode(string obj)
    {
        return Soundex(obj).GetHashCode();
    }

    private string Soundex(string data)
    {
        // code not included 
    }
}

我没有包含所有代码,因为这不是主要观点。只有你会知道SoundEx和Levenshtein是否会起作用,或者它是否需要成为其他东西。但是如果你把它的决定放在它自己的类中,如果它需要调整它只是一个需要改变的地方。

然后,您可以使用Linq或HashSet获取唯一列表。假设data是List

变量的名称
var uniqueEnumerable = data.Distinct(new CompanyNameComparer());
var uniqueSet = new HashSet<string>(data, new CompanyNameComparer());