C# Intersect不会返回所有匹配的值

C# Intersect不会返回所有匹配的值,c#,ienumerable,C#,Ienumerable,我有两个列表列表: 公共类MyClass:IEquatable { 公共字符串AccountNumber{get;set;} 公共int ID{get;set;} 公共int帐户类型{get;set;} 公共布尔等于(MyClass其他) { if(other==null)返回false; if(object.ReferenceEquals(this,other)) 返回true; 返回AccountNumber.Equals(其他.AccountNumber)和&AccountType.Equ

我有两个列表列表:

公共类MyClass:IEquatable
{
公共字符串AccountNumber{get;set;}
公共int ID{get;set;}
公共int帐户类型{get;set;}
公共布尔等于(MyClass其他)
{
if(other==null)返回false;
if(object.ReferenceEquals(this,other))
返回true;
返回AccountNumber.Equals(其他.AccountNumber)和&AccountType.Equals(其他.AccountType);
}
公共覆盖int GetHashCode()
{
int-hashAccountNumber=AccountNumber==null?0:AccountNumber.GetHashCode();
int hashType=AccountType.GetHashCode();
返回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();
var list1=新列表()
{
新建MyClass(){AccountNumber=“1”,AccountType=1,ID=1},
新建MyClass(){AccountNumber=“1”,AccountType=1,ID=2},
新建MyClass(){AccountNumber=“2”,AccountType=1,ID=3},
新建MyClass(){AccountNumber=“3”,AccountType=1,ID=4}
};
var list2=新列表()
{
新建MyClass(){AccountNumber=“1”,AccountType=1,ID=1}
};
var alist=list1.Intersect(list2.ToList();
alist
只有一个元素,其中
MyClass.ID==1
。它不会返回同样匹配的第二个。我也可以用另一种方法来做
var-alist=list2.Intersect(list1.ToList()和我得到相同的结果

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

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

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

来自:

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

发件人:

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


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

要实现所需,请尝试使用以下命令更改
Intersect

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

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

要实现所需,请尝试使用以下命令更改
Intersect

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

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

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

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

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

旁注:如果您正在实现
IEquatable
并重写
GetHashCode
,那么您也应该重写
Equals(object other)
@Damien\u我无法重写
Equals
<代码>错误1'MyClass.Equals(MyClass)':在我向其添加覆盖时,找不到合适的方法进行覆盖
。如果我使用相同的
IEquatable
签名,我是否应该覆盖
等于它?相反,我使用了类类型,因此我用类类型重载了Equals。如果您认为它不正确,请告诉我。您应该有两个Equals方法-一个接受您当前拥有的
MyClass
。另一个应该是对
Object.Equals(Object)
方法的重写。请参见@Jaques BTW文档中的示例,我觉得您的问题是XY问题。我不明白为什么十字路口不适合你。为什么希望同一对象出现两次?因为对象并非100%相同。我有这门课的缩略版。只有两个属性用于查看它是否是同一类型的对象,但其他属性使其唯一。我希望它们都在一个列表中,因为我必须如何构建输出端注意:如果你正在实现
IEquatable
并覆盖
GetHashCode
,你也应该覆盖
Equals(object other)
@Damien\u我无法覆盖
Equals
<代码>错误1'MyClass.Equals(MyClass)':在我向其添加覆盖时,找不到合适的方法进行覆盖
。如果我使用相同的
IEquatable
签名,我是否应该覆盖
等于它?相反,我使用了类类型,因此我用类类型重载了Equals。如果您认为它不正确,请告诉我。您应该有两个Equals方法-一个接受您当前拥有的
MyClass
。另一个应该是对
Object.Equals(Object)
方法的重写。请参见@Jaques BTW文档中的示例,我觉得您的问题是XY问题。我不明白为什么十字路口不适合你。为什么希望同一对象出现两次?因为对象并非100%相同。我有这门课的缩略版。只有两个属性用于查看它是否是同一类型的对象,但其他属性使其唯一。我希望它们都在一个列表中,因为我必须如何构建输出Hank,我问是否有解决方案。奥布维