2013-08-15 5 views
6

Diciamo che ho un array.Come unire un array alla stringa con una virgola per 3 elementi in C#

string[] temp = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" }; 

Voglio unirmi a loro con la virgola per 3 elementi come di seguito.

string[] temp2 = { "a,b,c", "d,e,f", "g,h,i", "j" }; 

So che posso usare

string temp3 = string.Join(",", temp); 

Ma questo mi dà il risultato come

"a,b,c,d,e,f,g,h,i,j" 

Qualcuno ha un'idea?

+0

Potete usare LINQ? – CodingIntrigue

+0

@RGraham Sì, posso. –

risposta

11

Un modo semplice e veloce, che raggruppa i tuoi oggetti in blocchi di tre:

string[] temp = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" }; 

string[] temp2 = temp.Select((item, index) => new 
{ 
    Char = item, 
    Index = index 
}) 
.GroupBy(i => i.Index/3, i => i.Char) 
.Select(grp => string.Join(",", grp)) 
.ToArray(); 

Aggiornato per utilizzare il sovraccarico di .GroupBy che consente di specificare un selettore di elementi poiché ritengo che questo sia un modo più semplice per farlo. Incorporated da @Jamiec's answer.

Che cosa sta succedendo qui:

  1. stiamo proiettando ogni elemento di temp in un nuovo elemento - un oggetto anonimo con Char e Index proprietà.
  2. Quindi raggruppiamo l'Enumerabile risultante dal risultato della divisione intera tra l'indice dell'elemento e 3. Con il secondo parametro a .GroupBy, stiamo specificando che vogliamo che ogni elemento nel gruppo sia la proprietà Char dell'oggetto anonimo.
  3. Quindi, stiamo chiamando .Select per proiettare nuovamente gli elementi raggruppati. Questa volta la nostra funzione di proiezione deve chiamare string.Join, passando ogni gruppo di stringhe a quel metodo.
  4. A questo punto abbiamo un IEnumerable<string> che sembra come lo vogliamo, quindi è solo questione di chiamare ToArray per creare un array dal nostro Enumerable.
+0

Lo adoro. Pulito, semplice e facile da dedurre ciò che il codice sta cercando di ottenere. – CodingIntrigue

+0

@RGraham: Grazie! –

+0

+1 questo è bello. – Habib

3

È possibile utilizzare MoreLINQ lotto:

var temp3 = temp.Batch(3).Select(b => String.Join(",", b)); 
+0

Da dove proviene questo batch? –

+0

@JoshuaSon c'è un collegamento. Puoi ottenere MoreLINQ da NuGet –

+1

Oh, capisco. Grazie mille per la tua risposta veloce. Ma preferirei usare bare C#. Comunque, grazie mille ancora. –

5

è possibile combinare un metodo Chunk (credit to CaseyB) con string.Join:

string[] temp2 = temp.Chunk(3).Select(x => string.Join(",", x)).ToArray(); 

/// <summary> 
/// Break a list of items into chunks of a specific size 
/// </summary> 
public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> source, int chunksize) 
{ 
    while (source.Any()) 
    { 
     yield return source.Take(chunksize); 
     source = source.Skip(chunksize); 
    } 
} 
+0

Implementazione bel chunking! –

4

Esso può essere fatto concatenando dichiarazioni Linq insieme:

var grouped = temp.Select((e,i) => new{ Index=i/3, Item=e}) 
       .GroupBy(x => x.Index, x=> x.Item) 
       .Select(x => String.Join(",",x)); 

esempio dal vivo: http://rextester.com/AHZM76517

Problemi correlati