我建議你創建一個IEqualityComparer來封裝邏輯來確定兩個字符串是否相等。
如果你想混搭的SoundEx和萊文斯坦可能是這樣的
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獲取唯一列表。假設數據是列表中變量的名稱
var uniqueEnumerable = data.Distinct(new CompanyNameComparer());
var uniqueSet = new HashSet<string>(data, new CompanyNameComparer());
您應該使用字符串的Levenshtein距離來測量它們的接近程度,並在某個閾值下刪除任何字符串。如果你想結束導致某種全局最小值的字符串,你可能想要做一些奇特的工作。這聽起來並不重要。 – Jashaszun
列表中有多少項(大約)? – spender
您是否保證列表中的所有名稱都具有從標準美式英語26字母表中抽取的表示形式?例如,如果您需要將「蘇黎世金融服務」與「蘇黎世金融服務有限公司」相匹配,那麼您的手中就會遇到更難的問題。這些字符串在第二個字符中不匹配。 –