C# 列表中的任意()方法<;日期时间>;不';我不能按预期工作

C# 列表中的任意()方法<;日期时间>;不';我不能按预期工作,c#,.net,linq,datetime,C#,.net,Linq,Datetime,我正在winforms中使用.NET4.6(这里的代码来自测试控制台应用程序) 我有一个DateTime的列表,我需要弄清楚这个列表是否包含特定的日期 为此,我尝试使用列表中的Any()。 即使列表中确实包含所需的日期,Any()仅返回false 下面是示例代码,它们也具有相同的行为。所以,如果我能对这段代码有任何想法,我想这对我真正的代码也会有帮助 List<DateTime> dateTimeList = new List<DateTime>(); DateTime

我正在winforms中使用.NET4.6(这里的代码来自测试控制台应用程序)

我有一个
DateTime
的列表,我需要弄清楚这个列表是否包含特定的日期

为此,我尝试使用列表中的
Any()
。 即使列表中确实包含所需的日期,
Any()
仅返回
false

下面是示例代码,它们也具有相同的行为。所以,如果我能对这段代码有任何想法,我想这对我真正的代码也会有帮助

List<DateTime> dateTimeList = new List<DateTime>();
DateTime dateNow = DateTime.Now;

DateTime date = new DateTime(dateNow.Year, dateNow.Month, dateNow.Day, dateNow.Hour, dateNow.Minute, 00);
date = date.AddMinutes(-10);
while (date < dateNow.AddMinutes(10))
{
    dateTimeList.Add(date);
    date = date.AddMinutes(1);
}

dateNow = dateNow.AddSeconds(-dateNow.Second);
dateNow = dateNow.AddMilliseconds(-dateNow.Millisecond);

foreach (DateTime dateInList in dateTimeList)
    Console.WriteLine("date list List:" + dateInList.ToString("ddMMyyyy hh:mm:ss:fffz") + " - VS - desired date:" + dateNow.ToString("ddMMyyyy hh:mm:ss:fffz"));

if (dateTimeList.Any(x => x == dateNow))
    Console.WriteLine("date found");
else
    Console.WriteLine("date Not found");

if (dateTimeList.Any(x => x.ToString("ddMMyyyy hh:mm:ss:fffz") == dateNow.ToString("ddMMyyyy hh:mm:ss:fffz")))
    Console.WriteLine("date string matched");
else
    Console.WriteLine("date string didn't match");
List dateTimeList=new List();
DateTime dateNow=DateTime.Now;
DateTime日期=新的日期时间(dateNow.Year,dateNow.Month,dateNow.Day,dateNow.Hour,dateNow.Minute,00);
日期=日期。添加分钟(-10);
while(日期x==dateNow))
Console.WriteLine(“找到日期”);
其他的
Console.WriteLine(“未找到日期”);
if(dateTimeList.Any(x=>x.ToString(“ddmmyyyyy hh:mm:ss:fffz”)==dateNow.ToString(“ddMMyyyy hh:mm:ss:fffz”))
Console.WriteLine(“日期字符串匹配”);
其他的
WriteLine(“日期字符串不匹配”);
输出:

您的
dateTimeList
中的项目和属性不等于您的
dateNow
Ticks
TimeOfDay
属性,并且
dateNow
的Ticks比
dateTimeList
中的多。您需要添加以下行:

dateNow = new DateTime(dateNow.Year, dateNow.Month,
           dateNow.Day, dateNow.Hour, dateNow.Minute, 00);

这将使您的
dateNow
勾号和
TimeOfDay
属性与您添加到
dateTimeList

中的属性相等。找出原因的关键是找出我们正在比较的两个
DateTime
之间的差异

如果打印日期时间的
Ticks
属性,您会发现如下内容:

636560893800004640
636560887800000000
636560893800004640
636560888400000000
636560893800004640
636560889000000000
636560893800004640
636560889600000000
636560893800004640
636560890200000000
636560893800004640
636560890800000000
636560893800004640
636560891400000000
636560893800004640
636560892000000000
636560893800004640
636560892600000000
636560893800004640
636560893200000000
636560893800004640
636560893800000000
636560893800004640
636560894400000000
636560893800004640
636560895000000000
636560893800004640
636560895600000000
636560893800004640
636560896200000000
636560893800004640
636560896800000000
636560893800004640
636560897400000000
636560893800004640
636560898000000000
636560893800004640
636560898600000000
636560893800004640
636560899200000000
636560893800004640
636560899800000000
如您所见,这两行很可能是您认为相等的两个
DateTime
s,但不是:

636560893800004640
636560893800000000
上面的是
dateNow
,下面的是列表中的一个

看到区别了吗
dateNow
的刻度比列表中的刻度多

为什么会这样

列表中的
DateTime
是从
date
创建的,该日期是使用带有6个参数的构造函数创建的。这将创建一个与您指定的一样的
DateTime
。这意味着创建的实例将不会有任何额外的“余数”标记。我可以看到,当您更改
dateNow
时,您试图删除所有不关心的额外组件,如秒和毫秒,但您忘记了滴答声。当您比较2
DateTime
s时,实际上是在比较刻度

new DateTime(1) == new DateTime(1)
true
new DateTime(1) == new DateTime(2)
false

因此,您需要从
dateNow
中删除额外的记号,以获得所需的结果,或者只需再次使用6参数构造函数。

计算机编程中有一句谚语“选择不会中断”。这意味着,当一些基本的、常用的、经过大量测试的软件似乎出现故障时,问题在于您误诊了问题,而不是工具出现故障

任何
都可以正常工作

错误在于您在一个位置正确舍入了日期,而在另一个位置错误舍入了日期,并且错误舍入的日期不等于正确舍入的日期。使用日期上的
勾号
属性,查看为什么您的舍入技巧中有一种是好的,而另一种是完全错误的。

问题 您与
AddSeconds
addmillizes
的同步精度达到
fff
(毫秒)的精度,但不达到(一千万分之一秒)的精度。后者是
Any()
使用的函数所必需的

一个解决方案 通过使用创建副本,将
DateTime
副本与其原型精确同步。然后,您的代码使用
Any()
准确地查找日期

在这里

List dateTimeList=new List();
DateTime dateNow=DateTime.Now;
//在构造函数中使用dateNow.Ticks创建精确的,
//同步日期时间克隆
DateTime日期=新的日期时间(dateNow.Ticks);
日期=日期。添加分钟(-10);
while(日期x==dateNow))
Console.WriteLine(“找到日期”);
其他的
Console.WriteLine(“未找到日期”);
var format=“ddMMyyyy hh:mm:ss:fffz”;
if(dateTimeList.Any(x=>x.ToString(格式)==dateNow.ToString(格式)))
Console.WriteLine(“日期字符串匹配”);
其他的
WriteLine(“日期字符串不匹配”);
在一边
我们可以通过使用而不是
fff

DateTime将日期字符串格式化为滴答声的精度,使用系统时钟,该系统时钟的精度众所周知,仅为10-15ms-如本问题答案中所强调的-

为了解决这个问题,您需要将
Any()
子句中的等式比较(
==
)替换为考虑到不精确性的检查。下面的代码与相距小于20毫秒的日期匹配

if (dateTimeList.Any(x => Math.Abs((dateNow - x).TotalMilliseconds) < 20)
    Console.WriteLine("date found");
else
    Console.WriteLine("date Not found");
if(dateTimeList.Any(x=>Math.Abs((dateNow-x).total毫秒)<20)
Console.WriteLine(“找到日期”);
其他的
Console.WriteLine(“未找到日期”);

文盲名单和在控制台中写每个日期时间怎么办?@Agent\u Orange我已经编辑了这个问题,我希望这能帮助你们改善情况
if (dateTimeList.Any(x => Math.Abs((dateNow - x).TotalMilliseconds) < 20)
    Console.WriteLine("date found");
else
    Console.WriteLine("date Not found");