Сравните два элемента списка с LINQ

Я пытаюсь найти, что выражение LINQ сравнивает два элемента списка.

То, что я хочу сделать:

List<int> _int = new List<int> { 1, 2, 3, 3, 4, 5};
_int.Where(x => x == _int[(_int.IndexOf(x)) + 1]);

К сожалению, только последнее +1 выпрыгивает из диапазона списка.

Как я могу сравнить один объект с его следующим в списке в выражении LINQ?

5
задан George Stocker 23 June 2010 в 14:46
поделиться

5 ответов

Не очень красиво, но должно работать.

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

Или следующее.

list.Take(list.Count - 1).Where((index, item) => list[index + 1] == item)
6
ответ дан 18 December 2019 в 14:42
поделиться
int i = 0;
_int.Where(x => 
{
    i++;
    return i < _int.Length && x == _int[i];
});
4
ответ дан 18 December 2019 в 14:42
поделиться
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);
2
ответ дан 18 December 2019 в 14:42
поделиться

Если вы действительно хотите сделать это с помощью лямбда-выражения, добавьте проверку привязки (которая либо всегда возвращает последний элемент, либо никогда, на ваш выбор).

Итеративный подход был бы более читабельным, ИМО.

0
ответ дан 18 December 2019 в 14:42
поделиться

Это интересная проблема, я бы, возможно, выбрал синтаксис выражения запроса, где это можно сделать как этот

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, тогда вы должны стремиться к чему-то вроде приведенного выше (или к чему-то, очевидно, лучше).

1
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: