Заставьте все строковые методы использовать собственный компаратор - PullRequest
0 голосов
/ 08 июня 2018

Есть ли способ переопределить все строки, чтобы использовать customcomparer, для всего проекта?Либо с множеством методов расширения или пользовательским классом строк?Это наивный подход?

У меня есть собственный компаратор строк, который я использую для некоторых словарей, которые поддерживают пользовательские компараторы, что означает:

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);
    }
}
...