簡體   English   中英

我可以使用 LINQ 更優雅地重寫它嗎?

[英]Can I rewrite this more elegantly using LINQ?

我有一個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 編寫這個?

(我知道,可以使用臨時變量來使它看起來更好,但這種代碼格式更好地傳達了我正在尋找的內容。)

你可以,但我個人不會一次完成所有的行——我會使用迭代器塊:

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();
}

你也可以使用聚合

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()));
}

你可以用 LINQ 做到這一點,但我不確定你是否比你更喜歡這個。 恐怕你不會。 :)

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

干杯,馬蒂亞斯

這與任何嵌套的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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM