linq与上一项比较

  • 本文关键字:一项 比较 linq linq
  • 更新时间 :
  • 英文 :


我需要通过删除所有项目来过滤列表。这些项目的语言代码与之前的项目相同(项目按时间排序)。通过这种方式,我想检测所有的过境点。

有没有办法用一行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扩展方法来实现,在该方法中您可以比较序列的相邻元素。

相关内容

  • 没有找到相关文章

最新更新