尝试模块化一些乳胶表生成代码,大量镀金。
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[]'
如果可能的话,我想用一串聚合命令做这个,可以用嵌套循环或其他各种方式做到这一点,我有兴趣更好地了解聚合。
答案 0 :(得分: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();
答案 1 :(得分:1)
因为你使用Aggregate错了。如果您查看definition of Aggregate,您会看到定义为:
public static TSource Aggregate<TSource>(
this IEnumerable<TSource> source,
Func<TSource, TSource, TSource> func
)
您注意到泛型只接受一种类型,因此您隐式调用Aggregate,这意味着函数的参数都必须是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();
如果你这样做了。