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());
你是在回答你自己的问题吗?是的,我发现我的解决方案很好。但我没有看到重复的答案:)