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
,如果要比较列表属性,则需要一些自定义差异。测试相等性的方法只测试两个对象是否相等。虽然您可以提供一些自定义代码来确定相等性本身,但没有现成的东西可以提供这种级别的差异匹配。您尝试过实现相同的功能,但没有成功:(我厌倦了实现相同的功能,但似乎没有得到预期的输出。)(