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[]'

如果可能的话,我想用一行聚合命令来做到这一点,已经可以在嵌套循环或各种其他方式中做到这一点,我有兴趣更好地了解聚合。

4

2 回答 2

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();
于 2012-10-02T02:43:02.700 回答
1

这是因为您错误地使用了聚合。如果您查看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();

如果你这样做了。

于 2012-10-02T03:00:56.897 回答