簡體   English   中英

Enumerable.Except與IEqualityComparer

[英]Enumerable.Except with IEqualityComparer

我有兩個字符串數組,newArray和oldArray,我想使用Enumberable.Except方法刪除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或者其他東西而放入了不同的項目,即使在我的自定義比較器中我正在刪除它們。

我真正不理解的是當我調試並逐步執行代碼時,我可以在自定義比較器類中看到每對項目都被分析,但只有在它們是相同的條件時才會看到。 例如,如果字符串“這是第一個術語”在newArray中並且字符串“This is the first array”在oldArray中,則調試器甚至不會進入比較器類,而是直接跳轉到我的writeline部分主類中的代碼。

簡單地說:您的哈希代碼沒有正確地鏡像您的相等方法。 如字符串"abc""abc"將從返回不同的值GetHashCode ,所以它永遠不會去接近測試Equals GetHashCode 必須為任何兩個可能相等的值返回相同的結果。 但是,兩個相等的字符串不必返回不同的哈希碼(盡管非常需要 ,否則一切都將進入相同的哈希桶)。

你可以使用:

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

但這看起來相當昂貴(垃圾串很可能一直在生成)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM