为什么String.IndexOf(String, StringComparison)
需要StringComparison
而不允许使用更通用的StringComparer
,甚至不允许IComparer<T>
或IEqualityComparer<T>
?
我制作了一个自定义StringComparer
以便与多个词典一起使用,并且想在项目的其他部分中使用它,但是如果没有很多扩展方法,即使找不到这些扩展方法,我也找不到找到它的好方法。
这是我做的比较器。它大致基于以下建议:Implementing custom IComparer with string
还要注意ModifyString是一个WIP。我希望根据与之比较的输入在此处添加更多内容。我也知道这很昂贵,但我只是在寻找解决方案的ATM,而不是性能。
public class CustomComparer : StringComparer
{
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();
}
private string ModifyString(string s)
{
//I know this code is expensive/naaive, your suggestions are welcome.
s = s.ToLowerInvariant();
s = s.Trim();
s = Regex.Replace(s, @"\s+", " ");//replaces all whitespace characters with a single space.
return s;
}
}
最佳答案
使用一个方便的IEnumerable
扩展名似乎已经应该了,您可以编写一个String
扩展名来使用StringComparer
。正如注释中所建议的那样,由于无法对自定义StringComparer
进行任何假设,因此会在每个位置测试所有可能的子字符串长度。
public static class IEnumerableExt {
public static T FirstOrDefault<T>(this IEnumerable<T> src, Func<T, bool> testFn, T defval) => src.Where(aT => testFn(aT)).DefaultIfEmpty(defval).First();
}
public static class StringExt {
public static int IndexOf(this string source, string match, StringComparer sc) {
return Enumerable.Range(0, source.Length) // for each position in the string
.FirstOrDefault(i => // find the first position where either
// match is Equals at this position for length of match (or to end of string) or
sc.Equals(source.Substring(i, Math.Min(match.Length, source.Length-i)), match) ||
// match is Equals to on of the substrings beginning at this position
Enumerable.Range(1, source.Length-i-1).Any(ml => sc.Equals(source.Substring(i, ml), match)),
-1 // else return -1 if no position matches
);
}
}
关于c# - 具有自定义StringComparer的IndexOf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50338199/