我知道我可以做循环,但我想要更简单的方式
我发现很难解释这个问题。如果有人编辑并解释我的问题,我会很高兴
exposur = exposur.Where(p => p.Campaigns.ID == Camp.Campaign.ID)
.Take(10)
.ToList()
.RemoveAll(x => x != null);
我有一个对象列表,我想在哪里匹配前10,并从列表中删除谁 对不起我的英文
答案 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));