从列表中删除类似字符串的有效方法是什么?
考虑由这些(和其他)字符串组成的List<string>
:
“SRS INVESTMENT MANAGEMENT,LLC”
“SRS投资管理”
“Maplelane Capital,Ltd。”
“Maplelane Capital,Limited”
所以我需要做的是删除“足够相似”的字符串。我的想法是,这应该通过大写列表的所有字符串来完成,然后删除除了另一个字符串的最后X个字符之外的所有字符串。最后,我希望这给我留下一个列表,其中只包含一个字符串,用于他们实际代表的每个真实公司。
关于如何实现这一目标的任何想法?
答案 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());