从另一个mvc中删除一个列表

本文关键字:一个 列表 另一个 mvc 删除 | 更新日期: 2023-09-27 17:51:22

我有两个相同类型的列表,我试图从一个列表中减去另一个列表中的信息,然后将结果保存到模型中。

我已经尝试了两种方法,但到目前为止,我都无法使其工作:

这是两个列表:

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));
我从这个问题中得到这个想法。

有谁知道我哪里错了吗?

从另一个mvc中删除一个列表

这些实例不相同,因此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方法将按预期工作