2010-12-16 28 views
12

tengo la lista A contiene {1,2,3,4,5,6}¿cómo acceder al elemento anterior en la lista usando linQ?

List<int> m=new List<int>(); 
for(int i=1;i<A.count;i++) 
{ 
int j=A[i]+A[i-1]; 
m.add(j); 
} 

cómo puedo hacer esto misma operación mediante LINQ?

+0

No hay nada malo con su pregunta, pero ¿por qué no solo usa un bucle 'for'? Cambiar lo anterior a LINQ probablemente no gane nada. –

+0

Me gusta saber cómo hacer esto usando linQ así que solo – ratty

+0

No escribe en mayúscula la Q en LINQ, todas las letras son parte del acrónimo, no solo la Q :) – RichK

Respuesta

28

Bueno, una traducción directa sería:

var m = Enumerable.Range(1, A.Count - 1) 
        .Select(i => A[i] + A[i - 1]) 
        .ToList(); 

sino también en cuenta:

var m = A.Skip(1) 
     .Zip(A, (curr, prev) => curr + prev) 
     .ToList(); 

O mediante la extensión de Jon Skeet here:

var m = A.SelectWithPrevious((prev, curr) => prev + curr) 
     .ToList(); 

Pero, como señala Jason Evans en un comentario, esto no ayuda mucho con la legibilidad o la brevedad, contra idering su código existente es perfectamente comprensible (y corto) y desea materializar todo de los resultados en una lista de todos modos.

No hay nada realmente mal con:

var sumsOfConsecutives = new List<int>(); 

for(int i = 1; i < A.Count; i++) 
    sumsOfConsecutives.Add(A[i] + A[i - 1]); 
+1

Gracias por la solución .Zip(). Está limpio, y solo lees la matriz 2x. – TNT

2

¿Qué tal algo así como

var l = A.Skip(1).Select((x, index) => x + A[index]).ToList(); 
2

Algunas de las otras respuestas asumen que los elementos de A son siempre va a ser 1, 2, 3, 4, 5, 6. Si esos valores alguna vez cambian, la solución se rompería, como los valores que cambian a 2, 3, 6, 7, 10.

Aquí está mi solución que funcionará con cualquier valor de A.

List<int> m = A.Skip(1).Select((element, index) => element + A.ElementAt(index)).ToList(); 

Vale la pena señalar que la pervivencia de un bucle, probablemente sería mejor que la piratería en conjunto una solución LINQ para esto.

0

En caso de que solo necesite el valor final, puede Agregarlo, es decir. necesita valor previo, pero no necesita cada valor individual para una nueva lista.

int last = 0; 
var r = m.Aggregate(last, (acc, it) => (last += it), (acc) => (last)); 
10

autorización así conseguir el artículo siguiente en la lista se puede utilizar:

A.SkipWhile(x => x != value).Skip(1).FirstOrDefault(); 

Así que para obtener el anterior el uso del artículo:

var B = A.ToList(); 
B.Reverse(); 
B.SkipWhile(x => x != value).Skip(1).FirstOrDefault(); 
Cuestiones relacionadas