次のデータが与えられます:
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));
obvoiusLinqアプローチは
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
、時間の一部を取り除き、aを使用してその部分DataView
を実行してみませんか。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
、前にコピーすることができます。