我有两个列表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中的所有匹配元素?我真的希望有:)
答案 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)));