IEnumerable.相交数据库不会返回所有匹配的值

本文关键字:返回 数据库 IEnumerable | 更新日期: 2023-09-27 18:11:56

我有两个列表List<MyClass>:

public class MyClass : IEquatable<MyClass>
{
    public string AccountNumber { get; set; }
    public int ID { get; set; }
    public int AccountType { get; set; }
    public bool Equals(MyClass other)
    {
        if (other == null) return false;
        if (object.ReferenceEquals(this, other))
            return true;
        return AccountNumber.Equals(other.AccountNumber) && AccountType.Equals(other.AccountType);
    }
    public override int GetHashCode()
    {
        int hashAccountNumber = AccountNumber == null ? 0 : AccountNumber.GetHashCode();
        int hashType = AccountType.GetHashCode();
        return hashAccountNumber ^ hashType;
    }
}

如果我使用以下代码

var list1 = new List<MyClass>()
{
    new MyClass() { AccountNumber = "1", AccountType = 1, ID = 1}, 
    new MyClass() { AccountNumber = "1", AccountType = 1, ID = 2},
    new MyClass() { AccountNumber = "2", AccountType = 1, ID = 3},
    new MyClass() { AccountNumber = "3", AccountType = 1, ID = 4}
};
var list2 = new List<MyClass>()
{
    new MyClass() { AccountNumber = "1", AccountType = 1, ID = 1 }
};
var alist = list1.Intersect(list2).ToList();

alist只有1个元素,其中MyClass.ID == 1。它不会返回第二个也匹配的。我也可以反过来做var alist = list2.Intersect(list1).ToList();,我得到相同的结果

我的IEquatable实现有问题吗?因为我不确定我做错了什么。或者这只是IEnumerable的工作方式?是否有另一种方法,我可以使用从列表1返回所有匹配元素?我真的希望有:)

IEnumerable.相交数据库不会返回所有匹配的值

交集是集合操作 (set理解为数据结构!),因此,我不明白为什么你的结果应该包含相同的项两次。集合是唯一元素的集合。

正如其他人已经说过的,Intersect将始终返回两个集合上存在的不同的元素列表。

为了达到你想要的效果,试着这样改变Intersect:

var alist = list1.Where(x => list2.Contains(x)).ToList();

From MSDN:

当枚举此方法返回的对象时,Intersect首先枚举,收集该序列中所有不同的元素。然后枚举第二个,标记在两个序列中出现的元素。最后,按照收集的顺序生成标记的元素。

试试这个,用这个代码你的Equals方法不会浪费:

var alist = list1.Where(m => list2.Any(n => n.Equals(m)));