使所有字符串方法都使用自定义比较器

时间:2018-06-08 18:55:16

标签: c# .net string dictionary string-comparison

对于整个项目,有没有办法重新定义所有字符串以使用自定义比较器?有很多扩展方法或自定义字符串类?这是一种天真的做法吗?

我有一个自定义字符串比较器,我用于一些字典,支持自定义比较器,意思是:

SomeDictionary = new Dictionary<string, string>(CustomComparer);
string someValue = SomeDictionary[somekey];//Uses Custom Comparison, not .Equals

我也为包含了一个扩展方法,我在某些地方需要它,你可以这样使用:

if(someString.Contains(key, new CustomComparer()))
    //Do Something

我只是试着这个:

if(someString.Contains(key, new CustomComparer()))
    someString = someString.Replace("x", "y");

由于我没有为它编写扩展方法,因此Replace()在实际字符串中看到“X”并表示它不等于“x”。我也可以对此进行扩展,但我担心这比我之前考虑的问题要大得多。

作为参考,这是扩展方法和StringComparer

public static class Extensions
{
    //Very crude, just calls the CustomComparer directly, ignores the parameter comparer
    public static bool Contains(this string source, string match, StringComparer comp)
    {
        if (match == null)
            throw new ArgumentException("Substring", "Substring cannot be null.");
        else
            return CustomComparer.ModifyString(source).Contains(match);
    }
}

public class CustomComparer : StringComparer
{
    public static Regex RemoveCharacters { get; set; } = new Regex(@"[\s-_(),.]+");

    public override int Compare(string x, string y)
    {
        return StringComparer.Ordinal.Compare(ModifyString(x), ModifyString(y));
    }

    public override bool Equals(string x, string y)
    {
        if (ModifyString(x).Equals(ModifyString(y)))
            return true;
        else
            return false;
    }

    public override int GetHashCode(string obj)
    {
        if (obj == null)
            return 0;
        else
            return ModifyString(obj).GetHashCode();
    }

    public static string ModifyString(string s)
    {
        return RemoveCharacters.Replace(s.ToLowerInvariant().Trim(), string.Empty);
    }
}

0 个答案:

没有答案