繁体   English   中英

DateTime比较与LINQ中的格式

[英]DateTime comparison with formatting in LINQ

我正在尝试编写一个简单的LINQ查询,在其中比较DateTime以获取结果。 我的要求是DateTime必须只比较到毫秒,因此我必须应用formatter。 查询如下

var availableValues = from value in AvailableValues
                      where DateTime.Compare(DateTime.ParseExact(value.Time.ToString("dd/MM/yyyy HH:mm:ss.fff"), "dd/MM/yyyy HH:mm:ss.fff", System.Globalization.CultureInfo.CurrentCulture),
                      DateTime.ParseExact(currentTime.ToString("dd/MM/yyyy HH:mm:ss.fff"), "dd/MM/yyyy HH:mm:ss.fff", System.Globalization.CultureInfo.CurrentCulture)) == 0
                      select value;

AvailableValues是一个巨大的集合,上面的查询引起了性能方面的打击。

如果有人可以建议我一种更好的方法来达到预期的结果,那将有很大的帮助。

  1. 缓存currentTime的值以避免每次比较都重新计算它

  2. 据我了解,您只想比较包括整个毫秒(无小数,无滴答)。 因此,您可以仅使用整个ms来创建新的DateTime值(如果查询提供程序允许的话):

     DateTime current = new DateTime( currentTime.Year, currentTime.Month, currentTime.Day, currenTime.Hour, currentTime.Minute, currentTime.Second, currentTime.Kind). AddMilliseconds(currentTime.Millisecond); var availableValues = from value in AvailableValues where currentTime == new DateTime( value.Time.Year, value.Time.Month, value.Time.Day, value.Time.Hour, value.Time.Minute, value.Time.Second, value.Time.Kind). AddMilliseconds(value.Time.Millisecond) select value; 

这比将DateTime转换为string然后再次返回要快得多。

我的要求是DateTime必须只比较到毫秒, 因此我必须应用formatter。

不,您不必应用格式化程序。 只需创建一个带有空毫秒部分的新日期即可。 代替

DateTime.Compare(date1, date2)

采用

DateTime.Compare(DropMilliseconds(date1), DropMilliseconds(date2))

或者,因为您只对相等感兴趣(而不对DateTime.Compare将为您提供的其他信息感兴趣):

DropMilliseconds(date1) == DropMilliseconds(date2)

DropMilliseconds定义如下(或任何其他实现 ):

private static DateTime DropMilliseconds(DateTime dtm)
{
    return new DateTime(dtm.Year, dtm.Month, dtm.Day, 
                        dtm.Hour, dtm.Minute, dtm.Second, 
                        dtm.Kind);
}

如果您担心方法调用的开销,可以告诉编译器积极地内联它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM