2012-10-02 92 views
1

試圖模塊化一些乳膠表代碼,大規模鍍金。聚合多維數組

var MIDRULE = @"\\\midrule"; 

var a = new []{new []{"a", "b", "c"}, new []{"1", "2", "3"}, new []{"alpha", "beta", "gamma"}}; 

a.Dump(); 

a.Aggregate(
     (x,y) => x.Aggregate((i,j) => i + "&" + j) 
      + MIDRULE + Environment.NewLine 
      + y.Aggregate((k,l)=>k+"&"+l)).Dump(); 

預期結果:

a&b&c\\\midrule 
1&2&3\\\midrule 
alpha&beta&gamma\\\midrule 

實際結果:

Cannot implicitly convert type 'string' to 'string[]' 

我想做到這一點與骨料的命令一個襯墊如果可能的話,已經可以做到這一點的嵌套循環或其他各種方式,我有興趣更好地瞭解聚合。

回答

3

嘗試:

string.Concat(a.Select(inner => string.Join("&", inner) 
           + MIDRULE + Environment.NewLine)) 
     .Dump(); 

要小心,不要使用Join對於外部調用,只要你想MIDRULE + Environment.NewLine附加到每個字符串包括最後一個。

編輯

既然你是熱衷於在這裏使用Aggregate(我不會推薦它,因爲它是的可讀性和更低效的),嘗試(未經測試):

a.Aggregate(string.Empty, (x, y) => x 
            + y.Aggregate(string.Empty, 
               (k, l) => k + "&" + l) 
            + MIDRULE 
            + Environment.NewLine) 
.Dump(); 
+0

感謝這個簡單的方法,我也喜歡看它是否只是用骨料雖然...看起來更具可讀性我 – Joe

+0

我添加了聚合的方式是可能的。如果我是你,我不會走這條路。 – Ani

1

它因爲你使用聚合錯誤。如果你看一下definition of Aggregate你會看到的定義是:

public static TSource Aggregate<TSource>(
    this IEnumerable<TSource> source, 
    Func<TSource, TSource, TSource> func 
) 

您注意到一般只需要一個類型,所以你是隱式調用總結這意味着參數的函數都必須是string []。當您嘗試使用類型字符串作爲參數並且期望的輸出發生編譯錯誤時。

關閉我的頭頂一個辦法做到這一點是

string.Join(MIDRULE + Environment.NewLine, a.Select(x => string.Join("&", x))).Dump(); 

如果你不想尾隨MIDRULE換行,並已建議

我不知道這是否是解決這個問題的最好方法,但它應該工作。

string.Concat(a.Select(inner => string.Join("&", inner) 
          + MIDRULE + Environment.NewLine)) 
    .Dump(); 

如果你沒有。

+0

感謝您的額外信息,我意識到我的預期結果錯誤,你是對的,我不希望後面的MIDRULE,但我認爲這是不公平的,因爲Ani先前的答案輸出我的(不正確的)預期結果。 – Joe