2012-04-13 18 views
5

Digamos que tengo una matriz¿LINQ funciona en Index?

byte[] myarr = {1,4,3,4,1,2,1,2,4,3,1,4,2};  

myarr será de longitud 13 (0-12 Index) que también será la longitud de int val [].

int[] val = new int[13]; 

Quiero comprobar índice de myarr donde su valor es 4, es decir 1,3,8,11.

entonces quiero

val[1]++; 
val[3]++; 
val[8]++; 
val[11]++; 

Una forma de hacer esto es usar para el bucle

for(int i=0; i<myarr.length; i++) 
{ 
    if(myarr[i] == 4) 
     val[i]++; 
} 

Podemos utilizar Array.indexOf pero devuelve el primer índice de ese valor lo que significa que el valor tiene que ser único y mi myarr tiene muchos de los mismos valores.

¿Esto se puede hacer utilizando linq?

+5

¿Por qué le importaría LINQ? Tu ejemplo de trabajo es perfectamente simple. Además, creo que lo mejor que podrías obtener de LINQ sería el valor real ... aún así tendrías que incrementarlo y reasignarlo nuevamente a la matriz – musefan

+1

La 'Q' en LINQ significa Query. LINQ se utiliza para * consultar * datos. Quieres * cambiar * datos. Su bucle for es la manera de hacer esto. –

+1

@GrahamClark: ¿posible idea para LINC? .... ¿Quién está adentro? – musefan

Respuesta

3

Esto es lo que terminé haciendo en LINQ (actualización incluida):

myarr.Select((b, i) => b == 4 ? i : -1) 
    .Where(i => i != -1) 
    .ToList().ForEach(i => val[i]++); 

Su versión no LINQ es obviamente mucho más conciso y fácil de leer, por lo que creo que debería usarla.

+0

Debe ser 'ForEach (i => val [i] ++)' Supongo que ... –

+0

@PetrAbdulin, correcto, arreglé la muestra del código. ¡Gracias! – GolfWolf

+0

@ w0lf: ¿Qué pasa con la condición -1 en dos lugares? –

1

puede utilizar un anonymous type para almacenar el index:

int[] newIndices = myarr.Select((i, index) => new { Index = index, Value = i }) 
      .Where (x => x.Value == 4) 
      .Select(x => x.Index + 1) 
      .ToArray(); 

Editar: Finalmente he entendido su pregunta;)

myarr.Select((i, index) => new { Index = index, Value = i }) 
       .Where(x => x.Value == 4) 
       .Select(x => x.Index) 
       .ForEach(i => myarr[i]++); 
+1

¿Dónde está la parte del 'incremento'? –

+0

@ L.B: Solo lea esa parte, corregida. –

+0

Crea una nueva matriz en lugar de modificar el 'val' existente. –

2

Se puede, pero no habrá más simple. LINQ solo te ayudará con la parte de consulta, la parte de actualización debe hacerse en un bucle foo, pero como la matriz contiene tipos de valores, necesitas obtener índices de tu consulta LINQ y no los valores reales, y no has ganado nada.