查找具有 Type 属性的两个列表之间的差异作为列表 C#

Finding differences between two Lists with a Type properties as List C#

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

这里是 class 详细信息

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;

如果此示例真正代表了您正在尝试执行的操作,则您可以根据您实际查看的字符串集这一事实来实施 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);
}

您正在将 .Except 应用于 UserDetails 的列表。但是您希望得到 Group 列表的差异,即 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();