C# 检查并仅更新列表中日期时间值的时间<;字典<;字符串,对象>&燃气轮机;使用linq
如何检查DateTime是否具有0小时0分钟0秒,并仅更新特定键的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&
列表中的时间值
使用普通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();