gpt4 book ai didi

c# - 获取相同类型对象的两个列表之间的差异

转载 作者:行者123 更新时间:2023-12-03 23:00:15 26 4
gpt4 key购买 nike

我有两个完全相同类型的对象的列表。一个比另一个拥有更多的元素。我想找到两者之间的区别,并尝试了多种方法,但似乎都返回完整列表,而不是一项或多项的差异。

        List<Permission> defaultPermList = defaultRole.Permissions.ToList();
foreach (var role in roles)
{
List<Permission> rolePermList = role.Permissions.ToList();
//All 3 below return the full set of defaultPermList. not the difference of the two lists
var permissions1 = defaultPermList.RemoveAll(x => rolePermList.Contains(x));
var permissions2 = defaultPermList.Where(x => !rolePermList.Contains(x)).ToList();
var permissions3 = defaultPermList.Except(rolePermList).ToList();
}

我查看了许多其他问题和答案,因此我进行了所有不同的尝试。

最佳答案

Linq .Except 应该能够比较 Permissions 对象的相等性。如果您有权访问 Permissions 源代码,则只需覆盖 Equals 和 GetHashCode 即可。当 defaultPermList.Except(rolePermList).ToList() 被调用时 - 它首先通过 object.GetHashCode() 比较所有元素是否相等,以及具有相同 hashCode 的元素与object.Equals()进行比较,除非我们覆盖它们。

public class Permissions
{

public string Name; // fields just for showing how to use them
public int Rights;

public override bool Equals(object obj)
{
var permission = obj as Permissions;
if (permission != null)
{
if(permission?.Name.Equals(this.Name) && permission.Rights.Equals(this.Rights)
{
return true;
}
}
return false
}

public override int GetHashCode()
{
return Name.GetHashCode() + 3*Rights.GetHashCode(); // you might use any alghorithm you see fit
}
}

这应该足以使 except 工作。但是,如果无法访问权限源代码 - 那么您可能应该编写自己的方法并在那里比较项目。

关于c# - 获取相同类型对象的两个列表之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37302288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com