[英]How can I write the following code more elegantly using LINQ query syntax?
[英]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.