Skip to main content
 首页 » 编程设计

c#之LINQ Except 将第一个集合的项目发送到 IEqualityComparer Equals 方法

2024年02月04日30dflying

<分区>

我正在尝试实现 IEqualityComparer<T>为了使用 Except具有复杂类型的集合。我在调试时遇到了一个奇怪的(或我不知道的常见问题)问题。我有两个包含不同数量项目的集合,如下所示。

{A, B, C, D, E}.Except({A, B}, new CustomComparer()).ToList()

通过添加 ToList()我能够调试覆盖 Equals(x, y) .它按预期工作,直到项目 C项目后 B , 除了发送 C和 D到 Equals(x, y)所以我无法区分这些元素属于第一个集合还是其中一个属于第二个集合。

下面是我的 IEqualityComparer 实现。 DifferenceHighlighter 是回调方法,让我可以在调用者位置收集差异。

public SubmoduleListComparer( 
  Action<FormerGsdmlComparison.SubModuleListDifferenceContainer, string, string> callBack,  
  string firstFileName,  
  string secondFilename) 
    { 
        DifferenceHighlighter = callBack; 
        m_FirstFileName = firstFileName; 
        m_SecondFileName = secondFilename; 
    }     
 
public bool Equals(Submodule x, Submodule y) 
{ 
        bool areEqual = true; 
        if (x == null || y == null) return false; 
 
        var submoduleDifferences = new FormerGsdmlComparison.SubModuleListDifferenceContainer 
        { 
            file1 = new FormerGsdmlComparison.Submodule 
            { 
                orderNumber = x.OrderNumber, 
                submoduleId = x.Id, 
                submoduleIdentNumber = x.SubmoduleIdentNumber 
            } 
        }; 
 
        if (x.Id != y.Id) 
        { 
            submoduleDifferences.file2.submoduleId = y.Id; 
            areEqual = false; 
        } 
        if (x.OrderNumber != y.OrderNumber) 
        { 
            submoduleDifferences.file2.orderNumber = y.OrderNumber; 
            areEqual = false; 
        } 
        if (x.SubmoduleIdentNumber != y.SubmoduleIdentNumber) 
        { 
            submoduleDifferences.file2.submoduleIdentNumber = y.SubmoduleIdentNumber; 
            areEqual = false; 
        } 
 
        if (!areEqual) 
        { 
            DifferenceHighlighter(submoduleDifferences, m_FirstFileName, m_SecondFileName); 
        } 
 
        return areEqual; 
    } 

正如我上面提到的;我期待着 Except()发送 null当对第二个集合的项目进行迭代时。相反,它将两个元素从第一个集合发送到 Equals(x, y)这是 LINQ Except 的默认行为,我应该做更多检查还是我遗漏了什么?

编辑

first集合包含 51 个元素和 second一个只包含 7 个元素。从两个集合中向 Equals(x, y) 发送 7 个项目后; Except 从 first 开始发送顺序项目收藏。例如:

This is the debug view for first items on both collections

上面一个正是我所期待的。前两项属于 Equals 方法。但是在第 7 次迭代之后; items on Equals(x, y) like that .

second收藏中没有这些元素。以上项目是 first 的第 8 和第 9 个元素收藏。所以我的 DifferenceHighlighter 假设这些是两个集合之间的差异。