我正在尝试编写一个简单的LINQ查询,其中比较DateTime以获得结果。我的要求是DateTime必须比较直到毫秒,因此我必须应用格式化程序。查询如下
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
是一个巨大的集合,上面的查询导致了性能上升。
如果有人可以建议我更好地实现预期结果,那将会有很大的帮助。
答案 0 :(得分:3)
缓存currentTime
的值,以避免为每次比较重新计算
据我了解,您只想比较包括整个毫秒(没有分数,没有刻度)。因此,您可以创建只有整数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
并再次转发要快得多。
答案 1 :(得分:2)
我的要求是必须比较DateTime直到毫秒和因此我必须应用格式化程序。
不,你不必申请格式化程序。只需使用空毫秒组件创建一个新日期。而不是
DateTime.Compare(date1, date2)
使用
DateTime.Compare(DropMilliseconds(date1), DropMilliseconds(date2))
或者,因为您只对equality感兴趣(不在DateTime.Compare会给您的其他信息中):
DropMilliseconds(date1) == DropMilliseconds(date2)
DropMilliseconds定义如下(或任何alternative implementation):
private static DateTime DropMilliseconds(DateTime dtm)
{
return new DateTime(dtm.Year, dtm.Month, dtm.Day,
dtm.Hour, dtm.Minute, dtm.Second,
dtm.Kind);
}
如果您担心方法调用开销,可以tell the compiler to aggressively inline it。