1

我有一个数据表,其中包含来自许多事件文件的许多字段。我需要能够在时间上选择不同的。日期时间字段是这种格式MM/dd/yyyy HH:mm:ss..我正在尝试这个:

dpall = RollUpValuesFunctions.jobTableFinalCSVOutput.DefaultView.ToTable();

我想知道是否有一种方法可以对日期时间字段应用约束以仅获得一个不同的日期,例如MM/dd/yyyy HH:mm
每分钟有几百条记录,但出于我的目的,我只需要那一分钟的一条记录。

这是在 C# 中

4

1 回答 1

0

给定以下数据:

var dt = new DataTable();
dt.Columns.Add(new DataColumn("Time", typeof(DateTime)));
dt.Rows.Add(new DateTime(2000, 12, 31, 12, 0, 0));
dt.Rows.Add(new DateTime(2000, 12, 31, 12, 0, 0));
dt.Rows.Add(new DateTime(2000, 12, 31, 12, 0, 1));
dt.Rows.Add(new DateTime(2000, 12, 31, 12, 0, 2));
dt.Rows.Add(new DateTime(2000, 12, 31, 12, 4, 2));
dt.Rows.Add(new DateTime(2000, 12, 31, 12, 5, 5));
dt.Rows.Add(new DateTime(2000, 12, 31, 12, 5, 2));

显而易见的 Linq 方法是

var result = from row in dt.AsEnumerable()
             let d = row.Field<DateTime>("Time")
             group row by new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, 0) into g
             select g.First();

foreach (DataRow row in result)
    Console.WriteLine(row["Time"]);   

但是既然您要求使用非 linq 解决方案,为什么不只遍历每一行,摆脱seconds部分时间,并使用 aDataView来完成该Distinct部分:

foreach (DataRow row in dt.Rows)
{
    DateTime d = row.Field<DateTime>("Time");
    row["Time"] = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, 0);
    // or use "tricks" like this
    // row["Time"] = d.AddTicks(-(d.Ticks % TimeSpan.TicksPerMinute));
}

foreach(DataRow r in new DataView(dt).ToTable(true).Rows)
    Console.WriteLine(r["Time"]);

如果你不想改变你的DataTable,你可以先复制它。

于 2012-08-16T13:09:02.980 回答