c# - 为什么 .Except() 和 Intersect() 不能使用 LINQ 在这里工作?

标签 c# linq collections

我有以下代码,但似乎不起作用:

上下文: 我有两个对象列表:
* listOne有100条记录
* listTwo 有 70 条记录

其中许多具有相同的 Id 属性(在两个列表中);

 var listOneOnlyItems = listOne.Except(listTwo, new ItemComparer ());

这是比较器

public class ItemComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        if (x.Id == y.Id)
            return true;

        return false;
    }

    public int GetHashCode(Item obj)
    {
        return obj.GetHashCode();
    }
}

运行此代码并查看结果后

listOneOnlyItems 

仍有 100 条记录(应该只有 30 条)。谁能帮我吗?

还有,正在运行

    IEnumerable<Item> sharedItems = listOne.Intersect(listTwo, new ItemComparer());

在sharedItems集合中返回零结果

最佳答案

public int GetHashCode(Item obj)
{
    return obj.Id.GetHashCode();
}

至少值得检查一下 - IIRC GetHashCode() 在相​​等性之前首先进行测试,如果它们没有相同的哈希值,则不会费心检查相等性。我不确定 obj.GetHashCode() 会发生什么——这取决于您在 Item 类上实现的内容。

关于c# - 为什么 .Except() 和 Intersect() 不能使用 LINQ 在这里工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3420228/

相关文章:

c# - 在linq中除以零异常

java - 从数组列表中删除元素

c# - 对于小数来说,值太大或太小

c# - 如何使用 C# 将图像转换为 Html 的数据 URI?

c# - 日期类型 c#.net 上的比较验证器

c# - C# linq 是否有类似于 SummaryStatistics 的东西?

c# - 无法将类型 'DynamicClass1' 转换为类型 <T>。 LINQ to Entities 仅支持转换 EDM 原语或枚举类型

c# - 真的有一个有效的代码路径,该函数不会返回值吗?

Java Lambda 复用 Stream

java - 检查 Arraylist 中是否存在项目的最有效方法是什么?