我有一份作家名单。
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
中删除WriterID
与listWriters
WriterID
匹配的记录。如何在LINQ中执行此操作?
答案 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();