Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较两个列表的UnorderedQuals方法在布尔值上失败_C#_List_Compare_Iequalitycomparer - Fatal编程技术网

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对您的帮助!《无序相等》的缩短版非常出色!谢谢