IndexOf与自定义StringComparer

时间:2018-05-14 20:04:47

标签: c# string comparison

为什么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;
    }
}

1 个答案:

答案 0 :(得分:1)

使用Sent: getId,03 (HEX) > A5 81 52 CS 的便捷扩展程序似乎已经存在,您可以编写IEnumerable扩展程序以使用String。正如评论中所建议的那样,所有可能的子字符串长度都在每个位置进行测试,因为不能对自定义StringComparer做出任何假设。

StringComparer