2011-11-18 9 views
5

Tengo una matriz de cadenas con los siguientes elementos:El uso de Skip y Take a recoger objetos alternativos en una matriz

string s = "M,k,m,S,3,a,5,E,2,Q,7,E,8,J,4,Y,1,m,8,N,3,P,5,H"; 
var items = s.split(','); 
var topThree = items.Take(3); 
var alternating1 = items.Skip(3).Take(1).Skip(1).Take(1).Skip(1).Take(1).Skip(1).Take(1); 

variables El alternating1 no tiene nada en ella y creo que entiendo por qué. Después de Omitir, Tomar devuelve 1 elemento, entonces intenta Saltar (1) y Tomar (1) pero no hay nada allí.

¿Hay alguna manera de que pueda hacer este patrón alterno?

+0

Is 's' siempre va a ser una cadena ? –

Respuesta

11

El enfoque más simple sería utilizar la sobrecarga de Where que tiene un índice:

var alternating = input.Where((value, index) => (index & 1) == 0); 

O utilizar % 2 lugar, lo que es equivalente:

var alternating = input.Where((value, index) => (index % 2) == 0); 
+1

¿No debería esa prueba ser '(index & 1) == 0'? ¿Si no, porque no? –

+0

@DavidKemp: Sí, debería. Corregido, gracias :) –

+2

Un pequeño detalle sobre el estilo: ¿no sería más indicativo del código de alto nivel que 'index & 1' usar' index% 2'? El propósito de la consulta es devolver cada dos elementos, no realizar movimientos de bits. – LukeH

Cuestiones relacionadas