C# 检查并仅更新列表中日期时间值的时间<;字典<;字符串,对象>&燃气轮机;使用linq

C# 检查并仅更新列表中日期时间值的时间<;字典<;字符串,对象>&燃气轮机;使用linq,c#,linq,dictionary,C#,Linq,Dictionary,如何检查DateTime是否具有0小时0分钟0秒,并仅更新特定键的列表中的时间值 使用普通For循环完成,但如何使用linq完成此操作 工作代码: using System; using System.Collections; using System.Collections.Generic; public class Program { public static void Main() { var data = new List<Dictionary&

如何检查DateTime是否具有0小时0分钟0秒,并仅更新特定键的
列表中的时间值

使用普通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());
            }
        }
    }
}

请尝试下面的代码。这将只返回时间为
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());
var newData=(来自数据中的dt
式中(((日期时间)dt[“结束”]).Hour==0&((日期时间)dt[“结束”]).Minute==0&((日期时间)dt[“结束”])。Second==0)
选择新字典(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
这里是同样的东西,只是写了一个不同的方式。选择更具可读性的内容

var newData = data.Where(dt => ((DateTime)dt["END"]).Hour == 0 && ((DateTime)dt["END"]).Minute == 0 && ((DateTime)dt["END"]).Second == 0)
                    .Select(dt => 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();
var newData=data.Where(dt=>((DateTime)dt[“END”])。Hour==0&((DateTime)dt[“END”])。min==0&((DateTime)dt[“END”])。Second==0)
.Select(dt=>newdictionary(dt.ToDictionary(kvp=>kvp.Key,kvp=>kvp.Key==“END”?((DateTime)kvp.Value).AddHours(23).AddMinutes(59).AddSeconds(59):kvp.Value)))
.ToList();

出于好奇,为什么希望更改为LINQ?LINQ是一个查询框架,您不需要使用LINQ来更新迭代,这里没有迭代,但通过在linq中为键和日期时间应用where子句将提高性能在
字典中使用
对象
这一事实表明,这不适合您的数据。为什么不为预订创建一个类,包含开始、结束和房间号的属性。然后,您可以封装将结束日期设置为午夜前一分钟的行为。@GaneshJangam这是一个糟糕的建议。您必须围绕框架工作这一事实应该告诉您您做得不对。另外,
List.ForEach
不是LINQ方法,它是
List
类中的方法
var newData = data.Where(dt => ((DateTime)dt["END"]).Hour == 0 && ((DateTime)dt["END"]).Minute == 0 && ((DateTime)dt["END"]).Second == 0)
                    .Select(dt => 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();