2008-10-13 12 views
5

C# "Flatten" Ruby Method Ruby yöntemini nasıl yapabilirim. Bu yöntem, bir sivri diziyi tek boyutlu bir dizide düzleştirir. ÖrneğinDüzleştirme Ruby yöntemi C#

:

s = [ 1, 2, 3 ]   #=> [1, 2, 3] 
t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]] 
a = [ s, t, 9, 10 ]  #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10] 
a.flatten     #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
+0

Çok boyutlu olmayanlar için değil, burada bir dizi (dizi dizi) diziyle uğraşıyorsunuz. – leppie

+0

Şerefe, benim hatam - sıralı. – chrisntr

cevap

12

Recursive çözüm:

IEnumerable Flatten(IEnumerable array) 
{ 
    foreach(var item in array) 
    { 
     if(item is IEnumerable) 
     { 
      foreach(var subitem in Flatten((IEnumerable)item)) 
      { 
       yield return subitem; 
      } 
     } 
     else 
     { 
      yield return item; 
     } 
    } 
} 

DÜZENLEME 1:

o genel bir yöntem olarak bir göz alamaz neden

Jon yorumlarda açıklıyor!

DÜZENLEME 2:

Matt bir uzantısı yöntemi yapma önerdi. Burada sadece ilk satırı değiştirin gidin:

public static IEnumerable Flatten(this IEnumerable array) 

ve bu gibi kullanabilirsiniz:

foreach(var item in myArray.Flatten()) { ... } 
+1

İlk düşüncem "Neden jenerik değil?" - ama tabi ki bu sadece çok nadiren T'nin yinelenebilir bir versiyonu ve aynı zamanda bir T. (örn. IEnumerable hala bir nesnedir, ancak IEnumerable bir dizedir.) Bunu açıklığa kavuşturmak faydalı olabilir cevapta. –

+0

Ayrıca C# içinde güçlü yazılmış bir düzensiz dizi bildirmek için herhangi bir yolu olduğundan emin değilim? Nesne [] olmalı, yani IEnumerable bu yöntem için makul bir parametre türüdür. –

+0

Mat: "Güçlü bir şekilde yazılan düzensiz dizi" ile ne kastettiğinizden emin değilsiniz, ancak int [] [] ve int [,] (sırasıyla, sıralı ve dikdörtgen diziler için) iyidir. –

2

Bir yorumda cevap verirdi ama 300'den fazla karakter gerekir.

@ Alexander'ın çözümü harika, ancak dizelerin dizileriyle ilgili bir soruna dönüşüyor. Dize IEnumerable uyguladığı için, her bir karakterdeki her karakteri döndüreceğine inanıyorum. Sen, sen bu durumlarda döndü umuyor ne tür bir şey söylemek için genel bir parametresini kullanabilirsiniz ör .:

public static IEnumerable Flatten<T>(IEnumerable e) 
{ 
    if (e == null) yield break; 
    foreach (var item in e) 
    { 
     if (item is T) 
      yield return (T)item; 
     else if (item is IEnumerable) 
     { 
      foreach (var subitem in Flatten<T>((IEnumerable)item)) 
       yield return subitem; 
     } 
     else 
      yield return item; 
    } 
} 
1

sadece IEnumerable # SelectMany kullanamazmiyim?