使用 Linq/Lambda 表达式将数据表中的 TimeSpan 转换为 Double

Convert TimeSpan to Double in Datatable using Linq / Lambda expression

我想转换这个DataTable

dt.Columns.Add(new DataColumn("timespan1", typeof(TimeSpan)));
dt.Columns.Add(new DataColumn("timespan2", typeof(TimeSpan)));

进入这个

dt.Columns.Add(new DataColumn("timespan1", typeof(double)));
dt.Columns.Add(new DataColumn("timespan2", typeof(double)));

我已经做到了。

Double d;        

foreach (DataRow row in dt.Rows)
{
     dr = dtNew.NewRow();

     dr[0] = row.ItemArray[0];
     Double.TryParse(((TimeSpan)(row.ItemArray[1])).TotalMinutes.ToString(), out d);

     dr[1] = d;
     Double.TryParse(((TimeSpan)(row.ItemArray[2])).TotalMinutes.ToString(), out d);

     dr[2] = d;
     dtNew.Rows.InsertAt(dr, 0);
}

有什么方法可以使用 Linq 或 lambda 表达式吗?我想将此 new <double> DataTable 绑定到堆积条形图。感谢你的帮助。谢谢。

你现在拥有的是正确的,除了你应该直接使用 TotalMinutes 而不将其转换为字符串,(如评论中提到的 Jon Skeet) .

LINQ 用于查询数据,不应该用于修改数据。您当前带有 foreach 循环的代码很清楚并且传达了意图。

但是如果您正在寻找 LINQ 语法,那么您可以这样做:

var dummyQuery = dt.AsEnumerable()
                .Select(dr => 
                dtNew.Rows.Add(dr.Field<TimeSpan>("timespan1").TotalMinutes,
                               dr.Field<TimeSpan>("timespan2").TotalMinutes))
                    .ToList();//To Iterate

这将使用两列中的 TotalMinutes 值填充新的 DataTabledtNew

另一种选择是将 Select 中的查询结果投影到匿名类型,然后使用反射创建 DataTable,例如 Fastest way to fill DataTable from LINQ query using DataContext