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返回所有匹配元素?我真的希望有:)
交集是集合操作 (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)));