我有两个相同类型的列表,我试图从一个列表中减去另一个列表中的信息,然后将结果保存到模型中。
我已经尝试了两种方法,但到目前为止,我都无法使其工作:
这是两个列表:
List<ApplicationsDetailsModel> AppList = ctx.Database.SqlQuery<ApplicationsDetailsModel>("exec get_applications_r").ToList();
var AppExceptionList = new List<ApplicationsDetailsModel>();
foreach(var g in AnIrrelevantList)
{
AppExceptionList.Add(new ApplicationsDetailsModel()
{
AppNum = g.AppNum,
AppName = g.AppName
});
}
所以它们现在都有相同格式的不同数据。
model.AppList = AppList.Except(AppExceptionList).ToList();
这不会产生任何错误,但也不会从第一个列表中减去第二个列表。
var onlyInFirst = AppList.RemoveAll(a => AppExceptionList.Any(b => AppList == AppExceptionList));
我从这个问题中得到这个想法。有谁知道我哪里错了吗?
这些实例不相同,因此Except
不会发现它们相等,因为它正在检查引用是否相等(这显然永远不会是这种情况)。对于您的情况,您需要编写一个自定义的相等比较器…我在这里试了一下……
public class ApplicationsDetailsModelEqualityComparer : IEqualityComparer<ApplicationsDetailsModel>
{
public bool Equals(ApplicationsDetailsModel x, ApplicationsDetailsModel y)
{
return x.AppNum == y.AppNum && x.AppName == y.AppName;
}
public int GetHashCode(ApplicationsDetailsModel obj)
{
int hashCode = (obj.AppName != null ? obj.AppName.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ obj.AppNum.GetHashCode();
return hashCode;
}
}
用法……
model.AppList = AppList.Except(AppExceptionList, new ApplicationsDetailsModelEqualityComparer()).ToList();
注意,我假设你的AppNum和AppName在你的列表中唯一地标识你的对象。
Except
方法不知道如何比较两个类型为ApplicationsDetailsModel
的对象。您需要使用IEqualityComparer
:
public class ApplicationsDetailsModelComparer : IEqualityComparer<ApplicationsDetailsModel> {
public bool Equals(ApplicationsDetailsModel first, ApplicationsDetailsModel second) {
return first.AppNum == second.AppNum;
}
public int GetHashCode(ApplicationsDetailsModel applicationsDetailsModel) {
return applicationsDetailsModel.AppNum.GetHashCode();
}
}
然后,像这样使用:
model.AppList = AppList.Except(AppExceptionList, new ApplicationsDetailsModelComparer ()).ToList();
如果AppNum
不是集合中的唯一值(如主键),可以随意调整比较器类以满足您的需求。
jgauffin对你链接到的问题的回答总结如下:
http://stackoverflow.com/a/13361682/89092
Except requires that Equals and GetHashCode is implemented in the traversed class.
问题是Except方法不知道如何比较ApplicationsDetailsModel的实例
你应该在ApplicationsDetailsModel中实现GetHashCode,以创建一种唯一标识实例的方法
你应该在ApplicationsDetailsModel中实现Equals,并使用GetHashCode的结果来返回实例是否应该被认为是"相等"。最好的方法可能是实现IEquatable接口:http://msdn.microsoft.com/en-us/library/ms131187(v=vs.110).aspx
当您执行这些步骤时,Except方法将按预期工作