使用LINQ从List <t>中删除匹配项目的元素

时间:2017-05-22 11:20:27

标签: c# linq

我知道我可以做循环,但我想要更简单的方式

我发现很难解释这个问题。如果有人编辑并解释我的问题,我会很高兴

 exposur = exposur.Where(p => p.Campaigns.ID == Camp.Campaign.ID)
                  .Take(10)
                  .ToList()
                  .RemoveAll(x => x != null);

我有一个对象列表,我想在哪里匹配前10,并从列表中删除谁 对不起我的英文

6 个答案:

答案 0 :(得分:1)

使用LINQ Except方法过滤集合:

exposur = exposur.Except(exposur.Where(p => p.Campaigns.ID == Camp.Campaign.ID).Take(10))
                 .ToList();

由于您的集合中有重复项,因此在不存储索引的情况下删除集合中前10个项目的最简单方法是使用RemoveAll来删除项目的计数器:

var counter = 0;
exposur.RemoveAll(p => p.Campaigns.ID == Camp.Campaign.ID && counter++ < 10);

这将修改原始列表exposur并删除与谓词匹配的前10个项目,而不会触及其他重复项。

答案 1 :(得分:1)

根据您在评论中的说明,您需要删除列表中符合条件的前10个项目。

您的原始代码是:

exposur = exposur.Where(p => p.Campaigns.ID == Camp.Campaign.ID)
                 .Take(10)
                 .ToList()
                 .RemoveAll(x => x != null);

这不起作用的原因是因为在第三行调用.ToList()后,您现在创建一个与原始exposur变量分开的新集合。

未编译的原因是.RemoveAll()返回int,这是删除的项目数。这不能分配给您的IEnumerable<T>

您需要做的是首先获取要删除的内容:

var toRemove = exposur.Where(p => p.Campaigns.ID == Camp.Campaign.ID)
                      .Take(10)
                      .ToList();

使用这个新集合,您可以从其他集合中删除它们。

exposur.RemoveAll(x => toRemove.Contains(x));

您不需要重新分配。同样,它返回已删除的数字。

答案 2 :(得分:0)

嗯,首先要排除它们会更容易:

authorsList = authorsList.Where(x => x.FirstName != "Bob").ToList();

然而,这只会改变authorsList的值,而不是从前一个集合中删除作者。或者,您可以使用RemoveAll:

authorsList.RemoveAll(x => x.FirstName == "Bob");

如果你真的需要基于另一个集合来做,我会使用HashSet,RemoveAll和Contains:

var setToRemove = new HashSet<Author>(authors);
authorsList.RemoveAll(x => setToRemove.Contains(x));

答案 3 :(得分:0)

var exposur = exposur.Where(p => p.Campaigns.ID == Campaign.ID).Take(10).ToList();
exposur.RemoveAll((x) => x!=null);

答案 4 :(得分:0)

Youu也可以使用此代码:

var stuffToRemove = exposur.SingleOrDefault( s => s.Campaigns.ID == Camp.Campaign.ID )
if( stuffToRemove.ID != 0 )
{
    exposur.Remove( stuffToRemove );
}

答案 5 :(得分:0)

var toRemove = exposur.Where(p => p.Campaigns.ID == Camp.Campaign.ID).Take(10).ToList();
exposur.RemoveAll(p => toRemove.Any(z => z == p));