2010-06-23 11 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

당신이 정말로, 람다 표현식으로 그것을 할 바운드 검사를 추가하려면 (중 항상 마지막 요소를 반환하거나 결코 당신의 선택).

IMO는 반복적 인 접근법이 더 읽기 쉽습니다.

1

그것은 흥미로운 문제이다, 나는 아마도이 배열 (또는 목록)에서 3를 추출하는 것이

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; 

같이 수행 할 수 있습니다 쿼리 식 구문 갈 것입니다. 물론 쿼리 식에서 할 수있는 일은 분명히 람다에서 할 수 있습니다.

편집 조엘의 솔루션은 내 것보다 훨씬 간단하며 목록이나 배열에서 작업하는 것이 필요하면 완벽합니다. 어떤 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); 
관련 문제