2

重複の可能性:
スペルの違いで類似した単語を認識する方法

「voest」、「vost」、「vöst」(ドイツ文化) の 3 つの文字列を比較しているときに、true が返されるようにしています。これは同じ単語であるためです。(実際には、oe と ö のみが同じですが、たとえば DB 照合 CI の場合、'vost' はタイプミスされた 'voest' であるため、どちらが正しいかは同じです)

string.Compare(..) / string.Equals(..) は、そのメソッドに提供する引数に関係なく、常に false を返します。

string.Compare() / Equals(..) が true を返すようにする方法は?

4

2 に答える 2

5

ウムラウトを無視するカスタム比較子を作成できます。

class IgnoreUmlautComparer : IEqualityComparer<string>
{
    Dictionary<char, char> umlautReplacer = new Dictionary<char, char>()
    {
        {'ä','a'}, {'Ä','A'},
        {'ö','o'}, {'Ö','O'},
        {'ü','u'}, {'Ü','U'},
    };
    Dictionary<string, string> pseudoUmlautReplacer = new Dictionary<string, string>()
    {
        {"ae","a"}, {"Ae","A"},
        {"oe","o"}, {"Oe","O"},
        {"ue","u"}, {"Ue","U"},
    };

    private IEnumerable<char> ignoreUmlaut(string s)
    {
        char value;
        string replaced = new string(s.Select(c => umlautReplacer.TryGetValue(c, out value) ? value : c).ToArray());
        foreach (var kv in pseudoUmlautReplacer)
            replaced = replaced.Replace(kv.Key, kv.Value);
        return replaced;
    }

    public bool Equals(string x, string y)
    {
        var xChars = ignoreUmlaut(x);
        var yChars = ignoreUmlaut(y);
        return xChars.SequenceEqual(yChars);
    }

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

Enumerableこれで、次のようなメソッドでこの比較子を使用できますDistinct

string[] allStrings = new[]{"voest","vost","vöst"};
bool allEqual = allStrings.Distinct(new IgnoreUmlautComparer()).Count() == 1;
// --> true
于 2012-11-26T10:33:55.777 に答える
0

比較でIgnoreNonSpaceオプションを試すことができます。voest - vost は解決しませんが、vost-vöst には役立ちます。

int a = new CultureInfo("de-DE").CompareInfo.Compare("vost", "vöst", CompareOptions.IgnoreNonSpace);
// a = 0; strings are equal.
于 2012-11-26T10:04:19.857 に答える