2012-10-02 94 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