Есть ли способ переопределить все строки, чтобы использовать 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);
}
}