C# 比较两个列表的UnorderedQuals方法在布尔值上失败
我使用无序相等扩展来比较两个列表。它工作得很好,除非唯一的区别是布尔值。以下是比较方法:C# 比较两个列表的UnorderedQuals方法在布尔值上失败,c#,list,compare,iequalitycomparer,C#,List,Compare,Iequalitycomparer,我使用无序相等扩展来比较两个列表。它工作得很好,除非唯一的区别是布尔值。以下是比较方法: 公共静态布尔无序相等(此IEnumerable列表1、IEnumerable列表2、IEqualityComparer比较器) { var d=新字典(比较器); foreach(列表1中的ts) { 如有(丁) { d[s]++; } 其他的 { d、 增加(s,1); } } foreach(列表2中的ts) { 如有(丁) { 丁(s)--;; } 其他的 { 返回false; } } 返回d.Val
公共静态布尔无序相等(此IEnumerable列表1、IEnumerable列表2、IEqualityComparer比较器)
{
var d=新字典(比较器);
foreach(列表1中的ts)
{
如有(丁)
{
d[s]++;
}
其他的
{
d、 增加(s,1);
}
}
foreach(列表2中的ts)
{
如有(丁)
{
丁(s)--;;
}
其他的
{
返回false;
}
}
返回d.Values.All(c=>c==0);
}
这是我的班级和IEqualityComparer:
public class SelectedEntities
{
公共int Id{get;set;}
公共bool IsDelegator{get;set;}
公共bool IsDelegate{get;set;}
}
公共类SelectedEntityQualityComparer:IEqualityComparer
{
公共bool等于(SelectedEntities x,SelectedEntities y)
{
if(object.ReferenceEquals(x,y))
返回true;
如果(x==null | | y==null)
返回false;
返回x.Id等于(y.Id);
}
public int GetHashCode(SelectedEntities obj)
{
返回obj.Id.GetHashCode();
}
}
使用此代码,我应该能够通过运行以下命令获得一个假值:
私有布尔比较列表()
{
布尔结果=假;
var list1=新列表();
var list2=新列表();
列表1.Add(新的selectedenties{Id=1,IsDelegator=false,IsDelegate=true});
列表1.Add(新的selectedenties{Id=2,IsDelegator=false,IsDelegate=true});
列表2.Add(新的selectedenties{Id=1,IsDelegator=false,IsDelegate=true});
list2.Add(新的SelectedEntities{Id=2,IsDelegator=false,IsDelegate=false});//这是不同的
结果=列表1.UnorderedQuals(列表2,新的SelectedEntityQualityComparer());
返回结果;
}
如果我将两个列表中的任何布尔值更改为不同,它将始终返回true。奇怪。您的
比较器
没有考虑所有字段。
目前您只比较Id
。那IsDelegator
和IsDelegate
呢
您应该添加它们:
public class SelectedEntitiesEqualityComparer : IEqualityComparer<SelectedEntities>
{
public bool Equals( SelectedEntities x, SelectedEntities y )
{
if( object.ReferenceEquals( x, y ) )
return true;
if( x == null || y == null )
return false;
return x.Id.Equals( y.Id ) &&
x.IsDelegator.Equals(y.IsDelegator) &&
x.IsDelegate.Equals(y.IsDelegate);
}
public int GetHashCode( SelectedEntities obj )
{
return obj.Id.GetHashCode( )^
obj.IsDelegator.GetHashCode()^
obj.IsDelegate.GetHashCode();
}
}
您的
比较器
没有考虑所有字段。
目前您只比较Id
。那IsDelegator
和IsDelegate
呢
您应该添加它们:
public class SelectedEntitiesEqualityComparer : IEqualityComparer<SelectedEntities>
{
public bool Equals( SelectedEntities x, SelectedEntities y )
{
if( object.ReferenceEquals( x, y ) )
return true;
if( x == null || y == null )
return false;
return x.Id.Equals( y.Id ) &&
x.IsDelegator.Equals(y.IsDelegator) &&
x.IsDelegate.Equals(y.IsDelegate);
}
public int GetHashCode( SelectedEntities obj )
{
return obj.Id.GetHashCode( )^
obj.IsDelegator.GetHashCode()^
obj.IsDelegate.GetHashCode();
}
}
哦,天哪。。。我怎么会错过呢?非常感谢@Ofir Winegarten对您的帮助!《无序相等》的缩短版非常出色!谢谢哦,天哪。。。我怎么会错过呢?非常感谢@Ofir Winegarten对您的帮助!《无序相等》的缩短版非常出色!谢谢