2011-11-18 12 views
5

Ho un array di stringhe con i seguenti elementi:Utilizzando Skip e Take a raccogliere oggetti si alternano in un array

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

variabile L'alternating1 non ha niente in esso e credo di aver capito perché. Dopo lo Skip poi Take restituisce 1 elemento in esso, quindi tenta di saltare (1) e Take (1) ma non c'è nulla lì.

C'è un modo per eseguire questo schema alternato?

+0

's' sta andando sempre essere una stringa ? –

risposta

11

L'approccio più semplice sarebbe quella di utilizzare il Where sovraccarico che prende un indice:

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

O, per usare % 2 invece, in modo equivalente:

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

Non dovrebbe questo test essere '(index & 1) == 0'? Se no, perché no? –

+0

@DavidKemp: Sì, dovrebbe. Risolto, grazie :) –

+2

Un piccolo tagliente riguardo allo stile: non userebbe 'index% 2' essere più indicativo dello scopo di alto livello del codice di' index & 1'? Lo scopo della query è di restituire ogni altro elemento, non eseguire il bit-twiddling. – LukeH

Problemi correlati