【问题标题】:Convert TimeSpan to Double in Datatable using Linq / Lambda expression使用 Linq / Lambda 表达式将 Datatable 中的 TimeSpan 转换为 Double
【发布时间】:2015-04-24 19:13:40
【问题描述】:

我想转换这个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 绑定到堆积条形图。感谢你的帮助。谢谢。

【问题讨论】:

  • 为什么要将 TimeSpan 转换为字符串然后解析它?为什么不直接使用dr[1] = ((TimeSpan) row.ItemArray[1]).TotalMinutes;?
  • 这真的很有道理。我使用 TryParse 作为安全转换。

标签: c# linq datatable


【解决方案1】:

你现在拥有的是正确的,除了你应该直接使用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 值填充新的DataTable、dtNew。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多