查找具有 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();
我试图找出两个列表之间的差异并将它们输出到弹出窗口。但不知何故,我没有使用 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();