IEnumerable.Intersect不返回所有匹配的值

时间:2015-09-09 07:53:15

标签: c# ienumerable

我有两个列表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的工作方式?有没有其他方法可以用来返回list1中的所有匹配元素?我真的希望有:)

2 个答案:

答案 0 :(得分:2)

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

要实现您的目标,请尝试使用以下方式更改Intersect

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

答案 1 :(得分:0)

尝试使用此代码,使用此代码不会浪费您的Equals方法:

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