根据具体情况从C#中的列表中删除列表

时间:2015-04-17 14:52:15

标签: c# asp.net asp.net-mvc linq

我想根据条件删除其他列表中存在的一个列表的对象,这里是我的两个列表

列表结构

list1 = {GuideId ,Text , Desc , SecId , NextBtnText , ParentId}

list2 = {userId , ParentId , GuideId , Status }

列表一的数据

list1[0]{GuideId = 1 , Text=abc , Desc=any , SecId =2 , ParentId = 2}

list1[1]{GuideId = 2 , Text=abc , Desc=any , SecId =2 , ParentId = 2}

list1[2]{GuideId = 3 , Text=abc , Desc=any , SecId =2 , ParentId = 2}

list1[3]{GuideId = 4 , Text=abc , Desc=any , SecId =2 , ParentId = 2}

list1[4]{GuideId = 5 , Text=abc , Desc=any , SecId =2 , ParentId = 2} 

清单2的数据

list2[0]{GuideId = 1 , Text=abc , Desc=any , SecId =2 , ParentId = 2}

list2[1]{GuideId = 2 , Text=abc , Desc=any , SecId =2 , ParentId = 2}

list2[2]{GuideId = 3 , Text=abc , Desc=any , SecId =2 , ParentId = 2} 

这些数据来自db,可能是千元

但我需要在GuideId匹配的地方删除列表中的数据

我申请的内容不起作用

这是代码

List1 = List1.Except(List2).ToList();

这是我的代码

  userGuideList = query.ToList<GuidedPopupsViewModel>();
     popUpGuideListVm = query2.ToList<GuidedPopupsViewModel>();
    popUpGuideListVm = popUpGuideListVm.Except(userGuideList).ToList();

3 个答案:

答案 0 :(得分:3)

这不起作用,因为Except不知道你想如何比较对象。所以它只是比较参考。您必须覆盖Equals + GetHashCode,否则您必须提供自定义IEqualityComparer<T>

但您也可以使用List.RemoveAll代替:

List1.RemoveAll(x=> List2.Any(x2 => x2.GuideId == x.GuideId));

答案 1 :(得分:0)

您可以尝试根据GuideId

进行删除
List2.Where(x => !List1.Select(y => y.GuideId).Contains(x.GuideId))

答案 2 :(得分:0)

另一种方法是在linq中使用foreach,这只是比较id,不需要覆盖,也不需要引用相等:

list2.ForEach(x => list.RemoveAll(y => y.GuidId == x.GuidId));