2013-08-15 10 views
6

Diyelim ki bir dizim var.Dize 3 öğede virgülle diziye nasıl eklenir C#

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

Aşağıdaki gibi 3 öğeye virgül ile katılmak istiyorum.

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

ben

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

kullanabilirsiniz biliyorum Ama bu bana kimse bir fikri var mı

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

olarak sonuç verir?

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

Eğer Linq kullanabilir miyim? – CodingIntrigue

+0

@RGraham Evet, yapabilirim. –

cevap

11

Bir hızlı ve kolay yolu, üç parçaları içinde ürün gruplandırma:

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

.GroupBy'un aşırı yükünü kullanmak üzere güncellenen bir öğe seçicisini belirtmenize izin veriyor, çünkü bunun daha temiz bir yol olduğunu düşünüyorum. @Jamiec's answer.

den Incorporated burada neler oluyor:

  1. Biz yeni bir elemanın içine temp her bir öğesini yansıtıyorsun - anonim nesne Char ve Index özelliklere sahip.
  2. Daha sonra sonuçta oluşan Enumerable öğesinin, öğenin endeksi ile 3 arasındaki tamsayı bölümü sonucu gruplandırılıyoruz. İkinci parametre .GroupBy ile, gruptaki her öğenin Char özelliği olmasını istiyoruz anonim nesnenin
  3. Daha sonra gruplandırılmış öğeleri yeniden yansıtmak için .Select numaralı telefonu arıyoruz. Bu sefer projeksiyon fonksiyonumuzun her bir dizeyi bu yönteme ileterek string.Join'u araması gerekiyor.
  4. Bu noktada, istediğimiz gibi görünen bir IEnumerable<string> adresimiz var, bu nedenle Enumerable'ımızdan bir dizi oluşturmak için ToArray numaralı telefon numarasını aramanız yeterli.
+0

Bunu seviyorum. Kodun başarmaya çalıştığı şeyi temiz, basit ve kolay anlaşılır. – CodingIntrigue

+0

@RGraham: Teşekkürler! –

+0

+ 1 bu güzel. – Habib

3

Sen MoreLINQ Toplu kullanabilirsiniz

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

Bu Batch nereden? –

+0

@JoshuaSon bir bağlantı var. NuGet –

+1

dan MoreLINQ alabilirsiniz, görüyorum. Hızlı cevabınız için çok teşekkürler. Ama ben çıplak C# kullanmayı tercih ederim. Neyse, tekrar çok teşekkürler. –

5

Sen string.Join ile Chunk yöntemi (credit to CaseyB) birleştirebilirsiniz:

+0

Güzel yığın uygulaması! –

4

Birlikte Linq ifadeleri zincirleme yapılabilir:

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

Canlı örnek: http://rextester.com/AHZM76517

İlgili konular