C# 查找两个具有列表C类型属性的列表之间的差异#

C# 查找两个具有列表C类型属性的列表之间的差异#,c#,.net,list,generics,collections,C#,.net,List,Generics,Collections,我试图找出两个列表之间的差异,并将它们输出到弹出窗口。但不知何故,我没有得到正确的区别,他们之间使用除了方法。请帮助指导实现此目标的最佳方法 这是课程的详细信息 public class UserDetails { public List<string> ManagementCenter; public List<string> Group; public List<string> Roles; } List<User

我试图找出两个列表之间的差异,并将它们输出到弹出窗口。但不知何故,我没有得到正确的区别,他们之间使用除了方法。请帮助指导实现此目标的最佳方法

这是课程的详细信息

public  class UserDetails

{

    public List<string> ManagementCenter;
    public List<string> Group;
    public List<string> Roles;
}
   List<UserDetails> userDetailsListFirst = new List<UserDetails>();
   List<UserDetails> userDetailsListSecond = new List<UserDetails>();

    //This is not working
   var valuesDifference =  userDetailsListSecond.Except(userDetailsListFirst);


  Expected Data
  -------------
  List A-
  Management Center: JP
  Application Group(s): Corporate   
  User Role(s): SuperRole; 

   List B-
   Management Center: JP
   Application Group(s): Corporate; Trading;Supplementary; 
   User Role(s): SuperRole; 

   Here Comparing List A with List B . and output should show missing one

   Management Center: JP
   Application Group(s):  Trading;Supplementary; 
   User Role(s): SuperRole;
公共类用户详细信息
{
公众名单管理中心;
公开名单组;
公开名单角色;
}
List userDetailsListFirst=新列表();
List userDetailsListSecond=新列表();
//这不起作用
var valuesDifference=userDetailsListSecond.Exception(userDetailsListFirst);
预期数据
-------------
列举-
管理中心:JP
应用程序组:公司
用户角色:超级角色;
名单B-
管理中心:JP
申请组别:法人团体;贸易;补充的
用户角色:超级角色;
这里比较列表A和列表B。输出应该显示缺少的一个
管理中心:JP
应用组:交易;补充的
用户角色:超级角色;

如果这个示例真正代表了您要做的事情,那么您可以根据实际查看的字符串集实现Equals覆盖和GetHashCode覆盖。在下面的代码中,我从ManagementCenter、Group和Roles列表中创建了一个长字符串,并使用它来比较相等性和创建哈希代码

public class UserDetails
{
    public List<string> ManagementCenter;
    public List<string> Group;
    public List<string> Roles;

    public override bool Equals(object obj)
    {
        if (obj is UserDetails)
        {
            var otherUserDetail = obj as UserDetails;
            return string.Equals(GetTestValue(this), GetTestValue(otherUserDetail));
        }
        else
        {
            return false;
        }
    }

    static string GetTestValue(UserDetails userDetail)
    {
        return string.Join(";", userDetail.ManagementCenter) + "|" + string.Join(";", userDetail.Group) + "|" + string.Join(";", userDetail.Roles);
    }

    public override int GetHashCode()
    {
        return GetTestValue(this).GetHashCode();
    }
}

[TestMethod]
public void TestMethod1()
{
    var a1 = new UserDetails
    {
        ManagementCenter = new List<string> { "JP" },
        Group = new List<string> { "Corporate" },
        Roles = new List<string> { "SuperRole" }
    };

    var a2 = new UserDetails  // same info, different object,
                              // should still be equal using
                              // our override of the equals method
    {
        ManagementCenter = new List<string> { "JP" },
        Group = new List<string> { "Corporate" },
        Roles = new List<string> { "SuperRole" }
    };

    var b = new UserDetails // different info, should not be equal
    {
        ManagementCenter = new List<string> { "JP" },
        Group = new List<string> { "Corporate", "Trading", "Supplementary" },
        Roles = new List<string> { "SuperRole" }
    };

    List<UserDetails> userDetailsListFirst = new List<UserDetails>();
    userDetailsListFirst.Add(a1);

    List<UserDetails> userDetailsListSecond = new List<UserDetails>();
    userDetailsListSecond.Add(a2);
    userDetailsListSecond.Add(b);

    //This is now working
    var valuesDifference = userDetailsListSecond.Except(userDetailsListFirst);
}
公共类用户详细信息
{
公众名单管理中心;
公开名单组;
公开名单角色;
公共覆盖布尔等于(对象对象对象)
{
if(obj是UserDetails)
{
var otherUserDetail=obj作为UserDetails;
返回字符串.Equals(GetTestValue(this)、GetTestValue(otherUserDetail));
}
其他的
{
返回false;
}
}
静态字符串GetTestValue(UserDetails userDetail)
{
返回string.Join(“;”,userDetail.ManagementCenter)+“|”+string.Join(“;”,userDetail.Group)+“|”+string.Join(“;”,userDetail.Roles);
}
公共覆盖int GetHashCode()
{
返回GetTestValue(this).GetHashCode();
}
}
[测试方法]
公共void TestMethod1()
{
var a1=新用户详细信息
{
ManagementCenter=新列表{“JP”},
组=新列表{“公司”},
角色=新列表{“超级角色”}
};
var a2=新用户详细信息//相同信息,不同对象,
//仍然应该平等使用
//我们对equals方法的重写
{
ManagementCenter=新列表{“JP”},
组=新列表{“公司”},
角色=新列表{“超级角色”}
};
var b=new UserDetails//不同的信息,不应相等
{
ManagementCenter=新列表{“JP”},
集团=新名单{“公司”、“交易”、“补充”},
角色=新列表{“超级角色”}
};
List userDetailsListFirst=新列表();
userDetailsListFirst.Add(a1);
List userDetailsListSecond=新列表();
userDetailsListSecond.Add(a2);
userDetailsListSecond.Add(b);
//这是现在的工作
var valuesDifference=userDetailsListSecond.Exception(userDetailsListFirst);
}

您正在应用
。除了
用户详细信息的列表
。但您希望得到
列表的差异,这是
UserDetails
的属性。对于每个列表仅包含一个
UserDetail
实例的示例,您可以执行以下操作:

UserDetail first = userDetailsListFirst[0];
UserDetail second = userDetailsListSecond[0];
UserDetail result;
result.ManagementCenter = second.ManagementCenter;
result.Role = second.Role;
result.Group = second.Group.Except(first.Group).ToList();

尝试覆盖UserDetails类中的equals…如果您的类未正确覆盖
equals
+
GetHashCode
,则默认情况下仅比较引用,而不比较属性。这就是为什么
可枚举。除了
不能按预期工作。因此,要么覆盖它们,要么为
提供自定义
IEqualityComparer
,除了
(或其他LINQ方法)。对于
GetHashCode
,如果要比较列表属性,则需要一些自定义差异。测试相等性的方法只测试两个对象是否相等。虽然您可以提供一些自定义代码来确定相等性本身,但没有现成的东西可以提供这种级别的差异匹配。您尝试过实现相同的功能,但没有成功:(我厌倦了实现相同的功能,但似乎没有得到预期的输出。)(