2つの文字列が等しいかどうかを判断するロジックをカプセル化する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が動作するのか、それとも別のものにする必要があるのか、あなただけが知っています。しかし、それを調整する必要がある場合、それを自分のクラスに入れれば、変更する必要がある場所は1つだけです。
次に、LinqまたはHashSetのいずれかで一意のリストを取得できます。データがリストの変数の名前であると仮定します。
var uniqueEnumerable = data.Distinct(new CompanyNameComparer());
var uniqueSet = new HashSet<string>(data, new CompanyNameComparer());
文字列にどれだけ近いかを測定し、特定のしきい値以下の文字列を削除するには、Levenshtein distanceを使用する必要があります。いくつかの並べ替えの全体的な最小をもたらす文字列で終わってほしい場合は、いくつかの素晴らしい作業をしたいかもしれません。これは些細なことではありません。 – Jashaszun
リスト内のアイテム数(約)? – spender
リストのすべての名前にアメリカの標準英語26文字のアルファベットの表記が含まれていることを保証していますか?たとえば、「チューリッヒ金融サービス」を「チューリッヒ・ファイナンシャル・サービシズ・リミテッド」と合致させる必要がある場合、あなたはより困難な問題を抱えています。これらの文字列は、2番目の文字に不一致があります。 –