我可以使用LINQ更优雅地重写它吗?

Hos*_*Aly 3 c# linq linq-to-objects

我有一个double[][]我想要转换为CSV字符串格式(即一行中的每一行,以逗号分隔的行元素).我这样写的:

public static string ToCSV(double[][] array)
{
    return String.Join(Environment.NewLine,
                       Array.ConvertAll(array,
                                        row => String.Join(",",
                                                           Array.ConvertAll(row, x => x.ToString())));
}
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的方式来使用LINQ编写这个?

(我知道,可以使用临时变量来使这看起来更好,但这种代码格式更好地传达了我正在寻找的东西.)

Mar*_*ell 6

你可以,但我不会亲自做所有的行 - 我会使用迭代器块:

public static IEnumerable<string> ToCSV(IEnumerable<double[]> source)
{
    return source.Select(row => string.Join(",",
       Array.ConvertAll(row, x=>x.ToString())));        
}
Run Code Online (Sandbox Code Playgroud)

这将返回每一行(调用者可以WriteLine有效地等,而无需缓冲所有内容).它现在也可以从任何double[]行来源调用(包括但不限于锯齿状数组).

此外 - 使用局部变量,您可以使用StringBuilder每个线稍微便宜一点.


要立即返回整个字符串,我会优化它以使用单个StringBuilder字符串进行所有字符串工作; 有点啰嗦,但效率更高(中间字符串少得多):

public static string ToCSV(IEnumerable<double[]> source) {
    StringBuilder sb = new StringBuilder();
    foreach(var row in source) {
        if (row.Length > 0) {
            sb.Append(row[0]);
            for (int i = 1; i < row.Length; i++) {
                sb.Append(',').Append(row[i]);
            }
        }
    }
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)