3

我有一个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())));
}

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

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

4

4 回答 4

6

你可以,但我个人不会一次完成所有的行——我会使用迭代器块:

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

这将返回每一行(然后调用者可以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();
}
于 2009-02-25T09:01:48.263 回答
2

你也可以使用聚合

public static string ToCSV(double[][] array)
{
  return array.Aggregate(string.Empty, (multiLineStr, arrayDouble) =>
           multiLineStr + System.Environment.NewLine + 
           arrayDouble.Aggregate(string.Empty, (str, dbl) => str + "," + dbl.ToString()));
}
于 2009-02-26T00:47:43.620 回答
1

你可以用 LINQ 做到这一点,但我不确定你是否比你更喜欢这个。恐怕你不会。:)

var q = String.Join(Environment.NewLine, (from a in d
                                      select String.Join(", ", (from b in a
                                                                select b.ToString()).ToArray())).ToArray());

干杯,马蒂亚斯

于 2009-02-25T09:08:53.673 回答
1

这与任何嵌套的double. 它还将ToString实现推迟到调用者,允许格式化同时避免混乱的IFormatProvider重载:

public static string Join(this IEnumerable<string> source, string separator)
{
    return String.Join(separator, source.ToArray());
}

public static string ToCsv<TRow>(this IEnumerable<TRow> rows, Func<double, string> valueToString)
    where TRow : IEnumerable<double>
{
    return rows
        .Select(row => row.Select(valueToString).Join(", "))
        .Join(Environment.NewLine);
}
于 2009-02-26T06:23:07.403 回答