C#查找两个通用列表之间的更改

C#查找两个通用列表之间的更改,c#,.net,generics,C#,.net,Generics,我在比较两个通用列表以查找更改集时遇到问题,因为更改的效果会传播到多个目标: 问题是: var (added, removed) = tripobject.Students.Difference(newtripObject.Students, new IdEqualityComparer<Student>()); 它们不是简单的类型(我必须使用comparer) 我需要知道更改(添加和删除的项目) 我必须创建一个可用的解决方案 例如: 假设您有一次旅行,并且希望打开更新屏幕来添

我在比较两个通用列表以查找更改集时遇到问题,因为更改的效果会传播到多个目标:

问题是:

var (added, removed) = tripobject.Students.Difference(newtripObject.Students, new IdEqualityComparer<Student>());
  • 它们不是简单的类型(我必须使用comparer)
  • 我需要知道更改(添加和删除的项目)
  • 我必须创建一个可用的解决方案
例如:

假设您有一次旅行,并且希望打开更新屏幕来添加或删除即将到来的学生。但是,简单的列表更新是不够的,因为您希望找到新添加或删除的学生,并向他们的家长发送电子邮件:

经过一些搜索和思考,我开发了一种通用的扩展方法,对我帮助很大……请在下面找到它
    /// <summary>
    /// A Function to compute the difference between two lists and returns the added and removed items
    ///  Removed = Old - New
    ///  Added = New - Old
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list">Old List</param>
    /// <param name="otherList">New List</param>
    /// <returns>Named Tuple of Added and Removed Items</returns>
    public static (List<T> added,List<T> removed) Difference<T>(this List<T> list, List<T> otherList,IEqualityComparer<T> comparer)
    {
        var removed = list.Except(otherList, comparer).ToList();
        var added = otherList.Except(list, comparer).ToList();
        return  (added:added,removed:removed);
    }
///一个函数,用于计算两个列表之间的差异,并返回添加和删除的项 ///删除=旧-新 ///添加=新-旧 /// /// ///旧名单 ///新名单 ///添加和删除项的命名元组 公共静态(添加列表、删除列表)差异(此列表、列表其他列表、IEqualityComparer比较器) { var removed=list.Except(otherList,comparer.ToList(); var added=otherList.Except(list,comparer.ToList(); 退货(增加:增加,删除:删除); } 该解决方案的另一个重要补充是通用比较器

/// <summary>
/// A generic Comparer depends on the Assumption that both types have an Id property
/// </summary>
/// <typeparam name="T"></typeparam>
public class IdEqualityComparer<T> : IEqualityComparer<T>
{
    public bool Equals(T Item1, T Item2)
    {
        if (Item2 == null && Item1 == null)
            return true;
        else if (Item1 == null || Item2 == null)
            return false;
        var id1 = Item1.GetType().GetProperty("Id").GetValue(Item1, null).ToString();
        var id2 = Item2.GetType().GetProperty("Id").GetValue(Item2, null).ToString();
        if (id1==id2)
            return true;
        else
            return false;
    }

    public int GetHashCode(T Item)
    {
        var id = Item.GetType().GetProperty("Id").GetValue(Item, null).ToString();
        return id.GetHashCode();
    }
}
//
///泛型比较器依赖于两种类型都具有Id属性的假设
/// 
/// 
公共类IdEqualityComparer:IEqualityComparer
{
公共布尔等于(T项1,T项2)
{
if(Item2==null&&Item1==null)
返回true;
else if(Item1==null | | Item2==null)
返回false;
var id1=Item1.GetType().GetProperty(“Id”).GetValue(Item1,null).ToString();
var id2=Item2.GetType().GetProperty(“Id”).GetValue(Item2,null).ToString();
如果(id1==id2)
返回true;
其他的
返回false;
}
公共int GetHashCode(T项)
{
var id=Item.GetType().GetProperty(“id”).GetValue(Item,null.ToString();
返回id.GetHashCode();
}
}
用法示例:

var (added, removed) = tripobject.Students.Difference(newtripObject.Students, new IdEqualityComparer<Student>());
var(added,remove)=tripobject.Students.Difference(newtripObject.Students,new IdEqualityComparer());

你是在回答你自己的问题吗?是的,我发现我的解决方案很好。但我没有看到重复的答案:)