使用linq

时间:2019-05-20 19:14:38

标签: c# linq dictionary

我如何检查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

1 个答案:

答案 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());