我需要通过删除所有项目来过滤列表。这些项目的语言代码与之前的项目相同(项目按时间排序)。通过这种方式,我想检测所有的过境点。
有没有办法用一行linq来做这件事?
var test = new List<Sample> { new Sample("AT", "test1"),
new Sample("AT", "test2") ,
new Sample("AT", "test3") ,
new Sample("DE", "test4") ,
new Sample("DE", "test5") ,
new Sample("DE", "test6") ,
new Sample("AT", "test7") ,
new Sample("AT", "test8") ,
new Sample("AT", "test9")
};
var borderChanges = new List<Sample>();
var lastCountry = "";
foreach (var sample in test)
{
if (sample.country != lastCountry)
{
lastCountry = sample.country;
borderChanges.Add(sample);
}
}
我想这就是你想要的:
test.Where((x,idx) => idx == 0 || x.Country != test[idx - 1].Country));
如果其他人想知道如何使用Aggregate()解决这个问题,下面是答案:
var borderChanges = test.Take(1).ToList();
test.Aggregate((last, curr) =>
{
if (last.Code != curr.Code)
{
borderChanges.Add(curr);
}
return curr;
});
Aggregate()为列表中除第一个元素外的每个元素执行lambda表达式。因此,我们用第一项初始化列表。
在λ中,我们添加当前项不等于聚合值的所有项。在我们的例子中,聚集的值总是以前检查过的项。
在foreach
迭代中,无法访问序列的相邻元素。也许您的目标可以通过IEnumerable<T>
的Aggregate扩展方法来实现,在该方法中您可以比较序列的相邻元素。