从标准的其他列表中删除列表项

时间:2010-11-30 10:02:35

标签: c# .net linq list

我有一份作家名单。

public class Writers{   
    long WriterID { get;set; }
}

此外,我还有两个类型文章列表。

public class Article{
    long ArticleID { get; set; }
    long WriterID { get; set; }
    //and others    
}

所以我的代码是:

List<Article> ArticleList = GetList(1);
List<Article> AnotherArticleList = AnotherList(2);
List<Writers> listWriters = GetAllForbiddenWriters();

我想从ArticleList AnotherArticleList中删除WriterIDlistWriters WriterID匹配的记录。如何在LINQ中执行此操作?

5 个答案:

答案 0 :(得分:90)

如果您确实有List<T>,我建议您在构建一组编写者ID后使用List<T>.RemoveAll

HashSet<long> writerIds = new HashSet<long>(listWriters.Select(x => x.WriterID));

articleList.RemoveAll(x => writerIds.Contains(x.WriterId));
anotherArticleList.RemoveAll(x => writerIds.Contains(x.WriterId));

如果你想要使用LINQ,你可以使用:

articleList = articleList.Where(x => !writerIds.Contains(x.WriterId))
                         .ToList();
anotherArticleList = anotherArticleList
                         .Where(x => !writerIds.Contains(x.WriterId))
                         .ToList();

请注意,这会更改变量,但不会修改现有列表 - 因此,如果对同一列表有任何其他引用,则不会看到任何更改。 (RemoveAll修改现有列表。)

答案 1 :(得分:41)

articlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID));
anotherArticlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID));

答案 2 :(得分:1)

只是一个设计提示,您的班级应该被称为Writer(单数形式),而不是Writers(复数)。列表中的每个项目代表一个作者,对吗?

答案 3 :(得分:1)

我真的不明白你面临的困难是什么......

为什么不使用简单的for循环过滤/删除列表中的数据? (注意,如果在编辑/更改迭代对象时进行迭代,则foreach循环肯定不起作用)

for (int i = ArticleList.Count -1; i >= 0; i--)
{
    for (int j = 0; j < listWriters.Count; j++)
    {
        if (ArticleList[i].WriterId == listWriters[j].WriterID )
            ArticleList.RemoveAt(i);
    }            
}

Backward迭代技巧解决了“迭代时删除项目”的范例。

答案 4 :(得分:0)

您可以使用Except

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();