可枚举.IEqualityComparer除外

本文关键字:除外 IEqualityComparer 枚举 | 更新日期: 2023-09-27 18:26:20

我有两个字符串数组,newArray和oldArray,我想使用Enumerable。除了方法删除newArray中也在oldArray中的所有项,然后将结果写入csv文件。

但是,我需要使用自定义比较器来检查格式的相似性(如果一个数组中有换行符,而另一个数组没有,我不希望将此项写入文件)。

截至目前我的代码:

        string newString = File.ReadAllText(csvOutputFile1);
        string[] newArray = newString.Split(new string[] {sentinel}, StringSplitOptions.RemoveEmptyEntries);
        string oldString = File.ReadAllText(csvOutputFile2);
        string[] oldArray = oldString.Split(new string[] { sentinel }, StringSplitOptions.None);
        IEnumerable<string> differnceQuery = newArray.Except(oldArray, new Comparer());
        using (var wtr = new StreamWriter(diffFile))
        {
            foreach (var s in differnceQuery)
            {
                wtr.WriteLine(s.Trim() + "#!#");
            }
        }

和自定义比较器类:

class Comparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        x = x.ToString().Replace(" ", "").Replace("'n", "").Replace("'r", "");
        y = y.ToString().Replace(" ", "").Replace("'n", "").Replace("'r", "");
        if (x == y)
            return true;
        else
            return false;
    }
    public int GetHashCode(string row)
    {
        int hCode = row.GetHashCode();
        return hCode;
    }
}

生成的文件并没有省略两个数组之间的格式差异项。因此,尽管它捕获了newArray中但不在oldArray中的项(就像它应该捕获的那样),但它也放入了仅因某个''n或其他原因而不同的项,即使在我的自定义比较器中我正在删除它们。

我真正不明白的是,当我调试和遍历代码时,我可以看到在我的自定义比较器类中分析的每一对项,但只有当它们相等时。例如,如果字符串"This is the 1st term"在newArray中,而字符串"Thisis the first array"在oldArray中,则调试器甚至不会进入comparer类,而是直接跳到主类中代码的写行部分。

可枚举.IEqualityComparer除外

简单地说:您的哈希代码不能正确地反映您的等式方法。像"a b c""abc"这样的字符串将从GetHashCode返回不同的值,因此它永远不会绕过来测试Equals。对于任何两个可能相等的值,GetHashCode必须返回相同的结果。然而,不需要两个不等于的字符串返回不同的哈希代码(尽管非常希望,否则所有内容都将进入同一个哈希桶)。

我猜你可以使用:

// warning: probably not very efficient
return x.Replace(" ", "").Replace("'n", "").Replace("'r", "").GetHashCode();

但这看起来相当昂贵(垃圾字符串可能会一直生成)