Compare two list elements with LINQ

非 Y 不嫁゛ 提交于 2019-12-01 05:49:22

Not that nice but should work.

list.Where((index, item) => index < list.Count - 1 && list[index + 1] == item)

Or the following.

list.Take(list.Count - 1).Where((index, item) => list[index + 1] == item)
int i = 0;
_int.Where(x => 
{
    i++;
    return i < _int.Length && x == _int[i];
});
List<int> _int = new List<int> { 1, 2, 3, 3, 4, 5 };
Enumerable.Range(0, _int.Count - 1)
    .Select(i => new {val = _int[i], val2 = _int[i + 1]})
    .Where(check => check.val == check.val2)
    .Select(check => check.val);

It's an interesting problem, I would perhaps go for query expression syntax where it can be done like this

int[] array = {1,2,3,3,4,5};
var query = from item in array.Select((val, index) => new { val, index })
            join nextItem in array.Select((val, index) => new { val, index })
            on item.index equals (nextItem.index + 1)
            where item.val == nextItem.val
            select item.val;

Which would extract 3 from the array (or list). Of course, what can be done in query expression can obviously be done in lambda.

Edit Joel's solution is much simpler than mine and if you just need it to work on a List or an array, it is perfect. If you need something more flexible to work against any IEnumerable, then you would aim for something like the above (or something obviously better).

If you really want to do it with a lambda expression, add a bound check (that either always returns the last element or never, your choice).

An iterative approach would be more readable though, IMO.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!