我如何检查DateTime是否具有0小时0分钟和0秒,并且仅更新List<Dictionary<string, object>>
中特定密钥的时间值?
使用常规的For循环完成,但是如何使用linq做到这一点
工作代码:
using System;
using System.Collections;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
var data = new List<Dictionary<string, object>>();
var d1 = new Dictionary<string, object>();
d1.Add("START", new DateTime(2019, 05, 12));
d1.Add("END", new DateTime(2019, 05, 14));
d1.Add("Room1", "Room1");
var d2 = new Dictionary<string, object>();
d2.Add("START", new DateTime(2019, 05, 12));
d2.Add("END", new DateTime(2019, 05, 14));
d2.Add("Room2", "Room2");
var d3 = new Dictionary<string, object>();
d3.Add("START", new DateTime(2019, 05, 12));
d3.Add("END", new DateTime(2019, 05, 14));
d3.Add("Room3", "Room3");
data.Add(d1);
data.Add(d2);
data.Add(d3);
if (data != null)
{
for (int i = 0; i < data.Count; i++)
{
DateTime dt = (DateTime)data[i]["END"];
Console.WriteLine("Before :" + data[i]["END"].ToString());
if (dt.Hour == 0 && dt.Minute == 0 && dt.Second == 0)
{
dt = dt.AddHours(23).AddMinutes(59).AddSeconds(59);
data[i]["END"] = dt;
}
Console.WriteLine("After :" + data[i]["END"].ToString());
}
}
}
}
输出如下:
Before :5/14/2019 12:00:00 AM
After :5/14/2019 11:59:59 PM
Before :5/14/2019 12:00:00 AM
After :5/14/2019 11:59:59 PM
Before :5/14/2019 12:00:00 AM
After :5/14/2019 11:59:59 PM
答案 0 :(得分:0)
尝试下面的代码。这只会从时间为Dictionary<string, object>
的{{1}}返回data
(就像您的示例代码一样)。它使用00:00:00
子句提取日期,然后使用Where
创建数据的新列表,但更改Select
的值。这将保留其他键的其他值。
END
这是同一件事,只是写法不同。选择更具可读性的内容。
var newData = (from dt in data
where (((DateTime)dt["END"]).Hour == 0 && ((DateTime)dt["END"]).Minute == 0 && ((DateTime)dt["END"]).Second == 0)
select new Dictionary<string, object>(dt.ToDictionary(kvp => kvp.Key, kvp => kvp.Key == "END" ? ((DateTime)kvp.Value).AddHours(23).AddMinutes(59).AddSeconds(59) : kvp.Value))
).ToList();
for (int i = 0; i < newData.Count; i++)
Console.WriteLine(newData[i]["END"].ToString());