興味深い問題:)私はそれを試すためにこの小さなテストプログラムを書きました。あなたがそれが理にかなっていると思うなら、あなたはそれをあなたのニーズに適応させることができるはずです。基本的に、基本日時から開始し、同じ24時間以内にランダムに1つの「テスト」を生成し、次にランダムに追加の時間を生成して、テスト値との差が最も小さいものを確認します(この場合はと比較されるものになります)。
List<DateTime> times = new List<DateTime>();
Random rnd = new Random();
int hourCount = (24 * 60) - 1;
DateTime dtBase = DateTime.Parse("01/01/2012 12:00 AM");
DateTime dtTest = dtBase.AddMinutes(rnd.Next(0, hourCount));
Console.WriteLine("Base: " + dtBase.ToString());
Console.WriteLine("Test: " + dtTest.ToString());
Console.WriteLine();
for (int i = 0; i < 24; i++) {
times.Add(dtBase.AddMinutes(rnd.Next(0, hourCount)));
}
times.Sort();
TimeSpan lastSpan = TimeSpan.MaxValue;
DateTime dtMatch = DateTime.Now;
foreach (DateTime dt in times) {
Console.Write(" " + dt.ToString());
var diff = (dtTest - dt).Duration();
if (diff < lastSpan) {
lastSpan = diff;
dtMatch = dt;
}
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("Closest match to {0:hh:mm tt} => {1:hh:mm tt} ({2})", dtTest, dtMatch, lastSpan);
サンプル出力の実行:
Base: 1/1/2012 12:00:00 AM
Test: 1/1/2012 3:28:00 AM
1/1/2012 1:03:00 AM
1/1/2012 2:51:00 AM
1/1/2012 2:52:00 AM
1/1/2012 3:22:00 AM
1/1/2012 4:30:00 AM
1/1/2012 4:36:00 AM
1/1/2012 5:50:00 AM
1/1/2012 5:55:00 AM
1/1/2012 6:50:00 AM
1/1/2012 7:05:00 AM
1/1/2012 7:17:00 AM
1/1/2012 8:53:00 AM
1/1/2012 9:25:00 AM
1/1/2012 11:59:00 AM
1/1/2012 12:22:00 PM
1/1/2012 12:51:00 PM
1/1/2012 2:04:00 PM
1/1/2012 3:01:00 PM
1/1/2012 3:26:00 PM
1/1/2012 4:19:00 PM
1/1/2012 6:15:00 PM
1/1/2012 11:02:00 PM
1/1/2012 11:28:00 PM
1/1/2012 11:50:00 PM
Closest match to 03:28 AM => 03:22 AM (00:06:00)
したがって、あなたの場合の実際の関数は次のようになります。
DateTime GetClosestTime(DateTime testTimeValue, List<DateTime> listItems) {
TimeSpan lastSpan = TimeSpan.MaxValue;
DateTime dtMatch = DateTime.Now;
foreach (DateTime dt in listItems) {
var diff = (testTimeValue - dt).Duration();
if (diff < lastSpan) {
lastSpan = diff;
dtMatch = dt;
}
}
return dtMatch;
}
testTimeValue
他の場所と比較する時間があれば、引数を省略するようにこれを書き直すことができます。
お役に立てれば!