【问题标题】:Finding differences between two Lists with a Type properties as List C#使用类型属性作为列表 C# 查找两个列表之间的差异
【发布时间】:2015-05-26 07:29:21
【问题描述】:

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

这是课程详情

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;

【问题讨论】:

  • 尝试在你的 UserDetails 类中覆盖 equals...
  • 如果你的类没有正确覆盖Equals + GetHashCode,默认情况下只会比较引用,而不是属性。这就是Enumerable.Except 无法按预期工作的原因。因此,要么覆盖它们,要么为 Except(或其他 LINQ 方法)提供自定义的 IEqualityComparer&lt;UserDetails&gt;Here's a possible implementation 代表GetHashCode,如果您想比较列表属性。
  • 您需要的是一些自定义差异。测试相等性的方法只测试 - 两个对象是否相等。虽然您可以提供一些自定义代码来确定相等性本身,但没有什么可以提供这种级别的差异匹配。
  • 已经尝试实现相同的,但没有运气:(

标签: c# .net list generics collections


【解决方案1】:

如果此示例真正代表了您正在尝试做的事情,您可以根据您实际查看字符串集的事实来实现 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);
}

【讨论】:

  • 我厌倦了同样的实现,但似乎我没有得到预期的输出。 :(
【解决方案2】:

您正在将.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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多