linq 从其他符合条件的列表中删除列表项

iklwldmw  于 2022-12-06  发布在  其他
关注(0)|答案(5)|浏览(272)

我有一个作家名单。

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();

我想从ArticleListAnotherArticleList中删除那些记录,其中WriterIDlistWritersWriterID匹配。如何在LINQ中执行此操作?

nfg76nw0

nfg76nw01#

如果您实际上有一个List<T>,我建议您在构造一组writer 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();

请注意,这会更改 variable,但不会修改现有列表--因此,如果存在对同一列表的任何其他引用,它们不会看到任何更改(而RemoveAll会修改现有列表)。

7qhs6swi

7qhs6swi2#

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

fdbelqdn3#

您可以使用Except

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

jexiocij4#

我真的不明白你面临的困难是什么...
为什么不使用一个简单的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);
    }            
}

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

trnvg8h3

trnvg8h35#

只是一个设计提示,你的类应该叫做Writer(单数形式),而不是Writers(复数形式)。

相关问题