2010-06-23 2 views
5

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

ответ

6

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

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

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

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

Что-то пошло не так с «index, item» (я должен был их переключить), но ваше первое решение работает, и нет необходимости в счетчике! Большое спасибо. – Gpx

4
int i = 0; 
_int.Where(x => 
{ 
    i++; 
    return i < _int.Length && x == _int[i]; 
}); 
+0

Разве это не проблема с последним элементом? –

+0

Нет, поскольку && является оператором короткого замыкания. То есть, когда i <_int.Length, x == _int [i] не будет оцениваться. – Odrade

+0

@Odrade, исходный комментарий был до проверки с длиной, отредактированной в. –

0

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

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

1

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

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

Редактировать Решение Joel намного проще, чем мое, и если вам просто нужно работать над списком или массивом, это идеально. Если вам нужно что-то более гибкое для работы с любым IEnumerable, тогда вы бы нацелились на что-то вроде выше (или что-то явно лучше).

2
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); 
Смежные вопросы