Сравните два элемента списка с LINQ - PullRequest
5 голосов
/ 23 июня 2010

Я пытаюсь найти выражение 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 ]

6 голосов
/ 23 июня 2010

Не очень хорошо, но должно работать.

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

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

list.Take(list.Count - 1).Where((index, item) => list[index + 1] == item)
4 голосов
/ 23 июня 2010
int i = 0;
_int.Where(x => 
{
    i++;
    return i < _int.Length && x == _int[i];
});
2 голосов
/ 23 июня 2010
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);
1 голос
/ 23 июня 2010

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

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

0 голосов
/ 23 июня 2010

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

Итерационный подход был бы более читабельным, хотя, IMO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...