2016-03-24 10 views
1

DateTimeを比較して結果を取得する簡単なLINQクエリを作成しようとしています。私の要件は、DateTimeはミリ秒までしか比較されないため、フォーマッタを適用する必要があるということです。LINQの書式設定との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が膨大なコレクションで、上記のクエリはもパフォーマンスヒットを引き起こしている、次のようにクエリがあります。

誰かが私に期待される結果を得るためのより良い方法を提案できれば、大きな助けになるでしょう。

+2

最初にcurrentTimeを解析するだけで済みます。 – schwindelig

+0

したがって、1ミリ秒の日付の日付は同じ日付とはみなされません。 – Steve

+1

この質問とその答えは、あなたの問題を解決するための有効な出発点になる可能性がありますhttp://stackoverflow.com/questions/1004698/how-to-truncate-milliseconds-off-of-a-net-datetime – Steve

答えて

3
  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; 
    

は、これが再びstringにごDateTime Sを変換し、よりはるかに高速である必要があります。

+1

私は彼がミリ秒の部分を比較したいと思っています。それを削除しないでください。 – Steve

+0

@Steve thxが私の誤解を指摘しています。私の答えを更新しました –

2

私の要件は、DateTimeのは、それゆえ私はフォーマッタを適用する必要がミリ秒とまでのみと比較しなければならないことです。

いいえ、フォーマッタを適用する必要はありません。ミリ秒単位の空の新しい日付を作成するだけです。代わりに

DateTime.Compare(date1, date2) 

使用

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

かの、あなたはequality(付加情報にDateTime.Compareはあなたを与えるいないこと)にのみ関心があるので、:DropMillisecondsと

DropMilliseconds(date1) == DropMilliseconds(date2) 

以下のように定義される(または任意の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とすることができます。

+1

彼は "fff"を使用していますので、ミリ秒を比較したいのに_whole_ミリ秒、分数もダニもナノ秒もありません。 –

+0

@RenéVogt:良い点。質問はいずれかの方法で解釈することができます( "until"は[包含的または排他的](http://ell.stackexchange.com/q/33340/27863))ので、私は答えを残します。そうでなければこの質問を見つける。どのような場合でも、主要な解決策は同じです:[1ミリ秒に丸める](http://stackoverflow.com/q/2872444/87698)は、それらを取り除くより簡単です。ああ、あなたの答えに+1! – Heinzi