Я пытаюсь найти, что выражение LINQ сравнивает два элемента списка.
То, что я хочу сделать:
List<int> _int = new List<int> { 1, 2, 3, 3, 4, 5};
_int.Where(x => x == _int[(_int.IndexOf(x)) + 1]);
К сожалению, только последнее +1
выпрыгивает из диапазона списка.
Как я могу сравнить один объект с его следующим в списке в выражении LINQ?
Не очень красиво, но должно работать.
list.Where((index, item) => index < list.Count - 1 && list[index + 1] == item)
Или следующее.
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);
Если вы действительно хотите сделать это с помощью лямбда-выражения, добавьте проверку привязки (которая либо всегда возвращает последний элемент, либо никогда, на ваш выбор).
Итеративный подход был бы более читабельным, ИМО.
Это интересная проблема, я бы, возможно, выбрал синтаксис выражения запроса, где это можно сделать как этот
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;
Которая извлекает 3 из массива (или списка). Конечно, то, что можно сделать в выражении запроса, очевидно, можно сделать и с помощью лямбда.
Править Решение Джоэла намного проще, чем мое, и если вам просто нужно, чтобы оно работало со списком или массивом, оно идеально. Если вам нужно что-то более гибкое для работы с любым IEnumerable, тогда вы должны стремиться к чему-то вроде приведенного выше (или к чему-то, очевидно, лучше).