2010-04-07 50 views
1

我有日期的列表在以下格式C#的DateTime操作

13/04/2010 10:30:00 
13/04/2010 13:30:00 
14/04/2010 10:30:00 
14/04/2010 13:30:00 
15/04/2010 10:30:00 
15/04/2010 13:30:00 
16/04/2010 10:30:00 
17/04/2010 11:00:00 
17/04/2010 13:30:00 
17/04/2010 15:30:00 

我怎麼能列表輸出的事件,以便日期只顯示一次緊跟時代該日期,因此上述名單看起來就像是這樣的:

13/04/2010 
10:30:00 
13:30:00 

14/04/2010 
10:30:00 
13:30:00 

15/04/2010 
10:30:00 
13:30:00 

16/04/2010 
10:30:00 

17/04/2010 
11:00:00 
13:30:00 
15:30:00 
+1

我認爲你需要更具體:日期在哪裏?他們如何檢索?你打算如何展示他們(什麼平臺)?等等。 – CAbbott 2010-04-07 15:03:22

+1

日期從哪裏來?文本或實際日期編號是否已在程序中格式化? – dawg 2010-04-07 15:03:32

回答

11

好吧,我不知道該顯示的一面,但如果你使用.NET分組側容易3.5+:

var groups = list.GroupBy(dateTime => dateTime.Date); 

foreach (var group in groups) 
{ 
    Console.WriteLine("{0}:", group.Key); 
    foreach(var dateTime in group) 
    { 
     Console.WriteLine(" {0}", dateTime.TimeOfDay); 
    } 
} 
+0

如果需要,您也可以將其轉換爲單個IEnumerable - 只需用yield return替換每個Console.WriteLine()。然後很容易將它發送到控制檯,但您也可以綁定到數據控件或執行其他任何您想要的操作。 – 2010-04-07 15:09:48

+2

這是你的答案。喬恩,你瘋了! – Audie 2010-04-07 15:10:12

+0

DateTime + C#== JonSkeet信號。 – 2010-04-07 15:11:20

0
 List<DateTime> dateTimes = new List<DateTime>(); 
     Dictionary<string, List<string>> data = new Dictionary<string, List<string>>(); 
     foreach (DateTime t in dateTimes) 
     { 
      if (!data.ContainsKey(t.ToShortDateString())) 
      { 
       data.Add(t.ToShortDateString(), new List<string>()); 
      } 

      data[t.ToShortDateString()].Add(t.ToShortTimeString()); 
     } 

     foreach (string key in data.Keys) 
      data[key].Sort(); 

     foreach (var pair in data) 
     { 
      Console.WriteLine(pair.Key); 
      foreach (string time in pair.Value) 
       Console.WriteLine(time); 

      Console.WriteLine(); 
     } 
+1

爲什麼所有的字符串轉換?爲什麼不只是在顯示點轉換? – 2010-04-07 15:09:59

0

如果你在你的東西像日期列表<日期時間>那麼你可以這樣做:

DateTime dtTemp = DateTime.MinValue; 
StringBuilder sb = new StringBuilder(); 
foreach(DateTime dt in MyDateList) 
{ 
    if (dt == dtTemp) sb.AppendLine(dt.ToString("HH:mm:ss")); 
    else 
    { 
     dtTemp = dt; 
     sb.AppendLine(); 
     sb.AppendLine(dt.ToString("dd/MM/yyyy HH:mm:ss")); 
    } 
} 
Console.WriteLine(sb.ToString().Trim()); 

編輯:修剪輸出以消除空白的第一線。

+0

這隻有在日期已經分組到輸入中時纔有效,這在示例中是正確的,但沒有說明。只要提到它,如果OP的例子不是他想要的。你會在開頭寫一行額外的行。 – 2010-04-07 15:09:43

+0

你說得對,我認爲列表根據示例進行了排序。謝謝。 – JYelton 2010-04-07 15:11:03