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,我问是否有解决方案。奥布维