我有两个相同类型的列表,我试图从另一个列表中减去一个列表中的信息,然后将结果保存到模型中。
我尝试了两种方法,到目前为止我无法工作:
以下是两个清单:
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));
我从this question得到了这个想法。
任何人都知道我哪里出错了?
答案 0 :(得分:1)
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
不是您馆藏中的唯一值(如主键),请随时根据您的需要调整比较器类。
答案 1 :(得分:1)
实例不一样,因此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一起唯一标识列表中的对象。
答案 2 :(得分:0)
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的结果来返回是否应该将实例视为“Equal”。最好通过实现IEquatable接口来实现:http://msdn.microsoft.com/en-us/library/ms131187(v=vs.110).aspx
执行这些步骤时,Except方法将按预期工作