根据ID成员从列表中删除存在于另一个列表中的项目

时间:2015-04-11 22:45:38

标签: c# linq

我有一个模特:

public class Post
{
    public int PostId { get; set; }
    public string Description { get; set; }
}

我有两个清单:

List<Post> posts
List<Post> exceptions

我想删除&#34;帖子&#34;中的所有项目PostId与&#34;例外&#34;

中的项目匹配

我试过了:

foreach (var post in posts)
{
    if (exceptions.Where(x => x.PostId == post.PostId) != null)
    {
        posts.RemoveAll(x => x.PostId == post.PostId);
    }
}

但我敢打赌,有一种更清洁的方法可以做到。

谢谢!

3 个答案:

答案 0 :(得分:2)

只需获取您要保留的posts并覆盖原始列表:

posts = posts.Where(p => !exceptions.Any(e => e.PostId == p.PostId).ToList();

答案 1 :(得分:0)

第一点:当你在帖子上做一个foreach时,你不能删除一个帖子。

你应该使用for循环代替。

第二点:在循环之前,在每个postid和包含th id的对象帖子之间使用一个映射。所以你的胜利不得不具有n ^ 2的复杂性。

答案 2 :(得分:0)

为了便于示例计算,我已经实现了两个列表来包含整数,而不是类对象,但逻辑是相同的。据我所知,您希望删除例外列表中可用的所有帖子对象。

    List<int> posts = new List<int>() { -3, -2, -1, 0, 1, 2, 3 };
    List<int> exceptions = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    IEnumerable<int> intersection = exceptions.Intersect(posts); /* returns the numbers that are both in the two lists */

    posts.RemoveAll(p => intersection.Contains(p)); /* remove the numbers from 'posts' that are intersected (1, 2, 3 are removed) */