有趣的問題:)我寫了這個小測試程序來嘗試一下。如果您認爲它有道理,您應該能夠適應您的需求。基本上,從一個基準日期時間開始,在同一個24小時內生成一個隨機的「測試」,然後隨機生成一堆附加時間,然後看看哪一個與測試值有最小的差異(在你的情況下成爲比較的人)。
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
參數。
希望這會有所幫助!
使用'var'掩蓋'item'的確切類型。他們是絃樂隊,對吧? –
是的..他們是字符串..我會編輯。 – ZVenue