对于整个项目,有没有办法重新定义所有字符串以使用自定义比较器?有很多扩展方法或自定义字符串类?这是一种天真的做法吗?
我有一个自定义字符串比较器,我用于一些字典,支持自定义比较器,意思是:
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);
}
}