C# 使用DataRowExtension解析时间跨度

C# 使用DataRowExtension解析时间跨度,c#,casting,timespan,C#,Casting,Timespan,我想用DataRowExtension将DataRow中字段的值作为TimeSpan(格式如mm:ss),但它给了我System.InvalidCastException,如下所示 var time = staffItems.Rows[0].Field<TimeSpan>("TIME_DURATION"); // System.InvalidCastException var-time=statffitems.Rows[0]。字段(“time_-DURATION”);//Syste

我想用DataRowExtension将DataRow中字段的值作为TimeSpan(格式如mm:ss),但它给了我System.InvalidCastException,如下所示

var time = staffItems.Rows[0].Field<TimeSpan>("TIME_DURATION"); // System.InvalidCastException
var-time=statffitems.Rows[0]。字段(“time_-DURATION”);//System.InvalidCastException
但当一个函数将该值作为字符串并在解析到TimeSpan之后,就不会出现问题

var time = staffItems.Rows[0].Field<string>("TIME_DURATION"); // time : 0:43
var time2 = TimeSpan.Parse(time); // time2 : 00:43:00
var-time=statffitems.Rows[0]。字段(“time_-DURATION”);//时间:0:43
var time2=TimeSpan.Parse(time);//时间2:00:43:00

问题是,如何使用DataRowExtension而不进行任何额外的解析或转换。

首先必须解析,然后获取时间部分

var time = TimeSpan.Parse(staffItems.Rows[0]["TIME_DURATION"]);
var time2 = time.ToString(@"mm\:ss");
如果您想从datarowextension获得它。您必须创建datatable并为“time\u DURATION”列指定time对象。您可以通过以下方法完成此操作:

using System;
using System.Data;

class Program
{
    static void Main()
    {
        //
        // Loop over DataTable rows and call the Field extension method.
        //
        foreach (DataRow row in GetTable().Rows)
        {
            // Get first field by column index.
            int weight = row.Field<int>(0);

            // Get second field by column name.
            string name = row.Field<string>("Name");

            // Get third field by column index.
            string code = row.Field<string>(2);

            // Get fourth field by column name.
            DateTime date = row.Field<DateTime>("Date");

            // Display the fields.
            Console.WriteLine("{0} {1} {2} {3}", weight, name, code, date);
        }
    }

    static DataTable GetTable()
    {
        DataTable table = new DataTable(); // Create DataTable
        table.Columns.Add("Weight", typeof(int)); // Add four columns
        table.Columns.Add("Name", typeof(string));
        table.Columns.Add("Code", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));
        table.Rows.Add(57, "Koko", "A", DateTime.Now); // Add five rows
        table.Rows.Add(130, "Fido", "B", DateTime.Now);
        table.Rows.Add(92, "Alex", "C", DateTime.Now);
        table.Rows.Add(25, "Charles", "D", DateTime.Now);
        table.Rows.Add(7, "Candy", "E", DateTime.Now);
        return table;
    }
}
使用系统;
使用系统数据;
班级计划
{
静态void Main()
{
//
//循环数据表行并调用字段扩展方法。
//
foreach(GetTable().Rows中的DataRow行)
{
//按列索引获取第一个字段。
整数权重=行字段(0);
//按列名获取第二个字段。
字符串名称=行字段(“名称”);
//按列索引获取第三个字段。
字符串代码=行字段(2);
//按列名获取第四个字段。
日期时间日期=行字段(“日期”);
//显示字段。
WriteLine(“{0}{1}{2}{3}”,重量、名称、代码、日期);
}
}
静态数据表GetTable()
{
DataTable=新建DataTable();//创建DataTable
table.Columns.Add(“Weight”,typeof(int));//添加四列
表.列.添加(“名称”,类型(字符串));
表.列.添加(“代码”,类型(字符串));
表.列.添加(“日期”,类型(日期时间));
table.Rows.Add(57,“Koko”,“A”,DateTime.Now);//添加五行
添加(130,“Fido”,“B”,DateTime.Now);
table.Rows.Add(92,“Alex”,“C”,DateTime.Now);
表.Rows.Add(25,“Charles”,“D”,DateTime.Now);
添加(7,“Candy”,“E”,DateTime.Now);
返回表;
}
}

下面的方法将在
数据行
扩展方法中将
字符串
解析为
时间跨度

public static TimeSpan ExtractTimeData(this DataRow row, string column)
{
    // check column exists in dataTable
    var exists = row.Table.Columns.Contains(column);

    if (exists)
    {
        // ensure we're not trying to parse null value
        if (row[column] != DBNull.Value)
        {
            TimeSpan time;

            if (TimeSpan.TryParse(row[column].ToString(), out time))
            {
                // return if we can parse to TimeSpan
                return time;
            }
        }
    }

    // return default TimeSpan if there is an error
    return default(TimeSpan);
}
你可以像这样使用它:

TimeSpan time = row.ExtractTimeData("TIME_DURATION");
string timeString = time.ToString(@"h\:mm");

时间持续时间字段可能是vharchar或DataTable中的其他内容。它必须等于时间跨度

行[0]有许多列,是否使用TimeSpan.Parse(StatffItems.Rows[0])进行聚合;行吗?我已经编辑了代码并添加了[“时间持续时间”]partI think,staffItems.Rows[0][“时间持续时间”]和staffItems.Rows[0].Field(“时间持续时间”)类似,您的解决方案与我的示例相同,我发现了它。我不想使用这个解决方案。问题是,我如何使用DataRowExtension而不进行任何额外的解析或强制转换呢?我想你不用尝试自己编写的代码就可以说出你所说的。您必须搜索并查看强制转换和解析操作之间的差异。不能从字符串强制转换日期或时间对象。但您可以解析该字符串并将其转换为时间对象。如果您想从datarowextension获得它,还有一件事。您必须创建datatable并为“time_DURATION”列指定时间对象。你可以勾选这个链接=>真正的答案是“如果你想从datarowextension获得更多的东西。你必须创建你的datatable并为“time_DURATION”列指定time对象。”你可以在问题下面的注释中看到这个答案。谢谢..
字段
强制转换一个已经是
时间跨度的值
。它相当于
(Timespan)
。它不解析,这就是为什么它在字符串内容中失败的原因。你说我必须将值作为字符串,并在转换到TimeSpan之后,对吗?