2010-06-23 43 views
5

Estoy tratando de encontrar una expresión LINQ para comparar dos elementos de lista.Comparar dos elementos de lista con LINQ

Lo que quiero hacer es:

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

Por desgracia, sólo la última +1 salta fuera del rango de la lista.

¿Cómo puedo comparar un elemento con el siguiente en la lista en una expresión LINQ?

Respuesta

6

No es tan bueno, pero debería funcionar.

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

O lo siguiente.

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

Algo salió mal con "index, item" (tuve que cambiarlos) pero su primera solución funciona y no hay necesidad de un contador afuera !! Muchas gracias. – Gpx

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

¿No tiene este problema con el último elemento? –

+0

No, porque && es un operador de cortocircuito. Es decir, cuando <_int.Length, x == _int [i] no se evaluará. – Odrade

+0

@Odrade, el comentario original fue antes de que se editara el cheque en contra de la longitud. –

0

Si realmente desea hacerlo con una expresión lambda, agregue una verificación encuadernada (que siempre devuelve el último elemento o nunca, a su elección).

Sin embargo, un enfoque iterativo sería más legible, IMO.

1

Es un problema interesante, me gustaría ir quizá para la sintaxis de expresión de consulta en el que se puede hacer como esto

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; 

cual sería extraer 3 de la matriz (o lista). Por supuesto, lo que se puede hacer en la expresión de consulta obviamente se puede hacer en lambda.

Editar La solución de Joel es mucho más simple que la mía y si solo la necesita para trabajar en una Lista o una matriz, es perfecta. Si necesitas algo más flexible para trabajar contra cualquier IEnumerable, entonces apuntarías a algo como lo anterior (o algo obviamente mejor).

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);