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

标签 c# asp.net-mvc list

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

        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/

相关文章:

java - 关于java中的泛型和列表

python - 得到 IndexError 时使数组重复

c# - WPF 应用程序未更新 WCF 服务的超时绑定(bind)信息

c# - 使用 System.DirectoryServices.AccountManagement 时 Active Directory 用户创建延迟

c# - 如何像在 stackoverflow 中那样执行 OpenId 实现

python - 如何在 Python 中将列表作为函数的输入传递

c# - 授权属性在 MVC 4 中不起作用

java - 如何将 byte[] c# 转换为 java byte[]

asp.net-mvc - 具有多个对象的 MVC 3 索引页

c# - 如果 .Count == 0 条件运算符不显示