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

时间:2014-03-21 14:49:25

标签: c# asp.net-mvc linq

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

我尝试了两种方法,到目前为止我无法工作:

以下是两个清单:

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得到了这个想法。

任何人都知道我哪里出错了?

3 个答案:

答案 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方法将按预期工作