2013-02-26 215 views
0

我試圖編寫一個控制檯應用程序來根據開始日期按升序排序我的日期和時間,這裏是我正在嘗試的一個示例。排序日期和時間

我輸入:

 
break Start1 = 15/02/12 12.30PM 
break End1= 15/02/12 01.30PM 
break Start2 = 15/02/12 11.00AM 
break End2= 15/02/12 12.00PM 
break Start3 = 15/02/12 12.00PM 
break End3= 15/02/12 01.00PM 

正在等我的輸出應該是這樣的:

 
break Start1 = 15/02/12 11.00AM 
break End1= 15/02/12 12.00PM 
break Start2 = 15/02/12 12.00PM 
break End2= 15/02/12 01.00PM 
break Start3 = 15/02/12 12.30PM 
break End3= 15/02/12 01.30PM 

請建議我解決這個最好的方法?

+1

你可以存儲相應的開始和結束日期/在哈希表或類似結構倍保持它們之間的關係? – Melanie 2013-02-26 22:06:43

+0

如果您根據收到的答案有新問題,請不要使用全新的問題編輯您的問題。這具有將答案從原始上下文中分離出來的作用,並且意味着它們對於新問題沒有意義。如果你有補充問題,最好問一個新問題,就像你現在所做的那樣 - 謝謝。 – halfer 2013-02-27 07:15:05

+0

對於ref,OP的[補充問題在這裏](http://stackoverflow.com/questions/15101915/how-to-add-date-objects-to-c-sharp-lists)。 – halfer 2013-02-27 07:15:54

回答

5

我建議要配對原來的開始和結束的值,然後只有起始日期訂購。

首先,您必須配對StartEnd。例如。與類:

public class Break 
{ 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
} 

然後,當你填充這些對象的集合,只是Start與LINQ訂購。

var breaks = new List<Break>() 
       { 
        new Break() 
         { 
          Start = new DateTime(2012,2,15,12,30,0), 
          End = new DateTime(2012,2,15,13,30,0) 
          ... /// etc. 
         } 
       }; 

var ordered = breaks.OrderBy(s => s.Start); 
foreach (var ord in ordered) 
{ 
    System.Console.WriteLine(ord.Start); 
    System.Console.WriteLine(ord.End); 
} 

編輯

要創建配對日期時間對象,您可以像使用方法:

public static Break ConvertToBreak(string startDate, string endDate, object gmtOffset) 
{ 
    var dtStart = UnixTimeConverter(startDate, System.Convert.ToDecimal(gmtOffset)); 
    var dtEnd = UnixTimeConverter(endDate, System.Convert.ToDecimal(gmtOffset)); 
    return new Break{Start = dtStart, End = dtEnd}; 
} 
+1

這是將開始和結束時間組合在一起的唯一解決方案(截至目前)。所有其他解決方案將日期時間視爲6個單獨的項目。 – JackAce 2013-02-26 22:31:51

1

,你可以把你所有的DateTime是否在數組或列表中,並使用標準方法對數組或列表進行排序,在這裏看到了一個例子:http://www.csharp-examples.net/sort-array

在.NET中DateTime實現IComparable接口,以便對這些變量進行比較/排序非常容易。

這麼說,你可以有兩個數組或矩陣,並分別進行排序他們每個人,因爲從你的例子,它看起來像你從開始列一個值和恩柱等一個值...

1

似乎就像你只想排序日期/時間對象一樣。由於您發佈的代碼不是C#,我會做一些假設。

首先:讓我們假設您在DateTime object的日期/時間組合。我會假設你有他們的名單。

List<DateTime> dateTimes = new List<DateTime>(); 
dateTimes.AddRange(new [] 
{ 
    new DateTime(2012, 02, 15, 12, 30, 00), // 15/02/12 12.30PM 
    new DateTime(2012, 02, 15, 13, 30, 00), // 15/02/12 01.30PM 
    new DateTime(2012, 02, 15, 11, 00, 00), // 15/02/12 11.00AM 
    new DateTime(2012, 02, 15, 12, 00, 00), // 15/02/12 12.00PM 
    new DateTime(2012, 02, 15, 12, 00, 00), // 15/02/12 12.00PM 
    new DateTime(2012, 02, 15, 01, 00, 00), // 15/02/12 01.00PM 
}); 

可以這樣就地對它們進行排序:

dateTimes.Sort(); 

或其他方式,如果你有一個數組或任何一般IEnumerable<T>,你可以得到一個新的枚舉序列,下令:

IEnumerable<DateTime> dateTimes = new [] 
{ 
    new DateTime(2012, 02, 15, 12, 30, 00), // 15/02/12 12.30PM 
    new DateTime(2012, 02, 15, 13, 30, 00), // 15/02/12 01.30PM 
    new DateTime(2012, 02, 15, 11, 00, 00), // 15/02/12 11.00AM 
    new DateTime(2012, 02, 15, 12, 00, 00), // 15/02/12 12.00PM 
    new DateTime(2012, 02, 15, 12, 00, 00), // 15/02/12 12.00PM 
    new DateTime(2012, 02, 15, 01, 00, 00), // 15/02/12 01.00PM 
}; 

var orderedDateTimes = dateTimes.OrderBy(dt => dt); 
+0

我不認爲這會做他想做的事,因爲開始和結束日期時間值需要配對。您應該排序3個項目而不是6. – JackAce 2013-02-26 22:30:08

1

這裏是我會做它

我不知道你對他們是如何或是否正在發送的結束時間總是1小時過去的開始時間,這個例子簡單說明了如何進行相應的分類他們有什麼具體的要求。

//GetYourInputValues() refers to however you plans on pulling in these inputs. 
//It wasn't made clear in your post how you planned to do that. 
string[] inputValues = GetYourInputValues(); 

//List that we will build, then sort, then print out. 
List<DateTime> sortedDateTime = new List<DateTime>(); 

//Parse them into DateTime variables 
foreach(var input in inputValues) 
{ 
    DateTime inputDate; 
    if(DateTime.TryParse(input, inputDate)) 
     sortedDateTime.Add(inputDate); 
} 
//Sort them ascending (for descending, flip a and b values) 
sortedDateTime.Sort((a, b) => a.CompareTo(b)); 

//Print out the newly sorted values to console. 
foreach(DateTime dt in sortedDateTime) 
{ 
    Console.WriteLine(dt.ToString("MM/dd/yy hh:mm:ss tt")): 
} 
1

注:如果你都應該把每個開始/結束爲一對(讓他們永遠在一起),那麼你就必須做一些細微的變化(見@ mipe34答案)。否則,這裏是如何做到這一點的完整工作示例:

static void Main(string[] args) { 
    string text = 
    @"break Start1 = 15/02/12 12.30PM 
    break End1= 15/02/12 01.30PM 
    break Start2 = 15/02/12 11.00AM 
    break End2= 15/02/12 12.00PM 
    break Start3 = 15/02/12 12.00PM 
    break End3= 15/02/12 01.00PM"; 

    string[] splitted = text.Split(new string[] {"\n", "\r"}, StringSplitOptions.RemoveEmptyEntries); 
    IList<DateTime> starts = new List<DateTime>(); 
    IList<DateTime> ends = new List<DateTime>(); 
    for (int i = 0; i < splitted.Length; i++) { 
     string line = splitted[i].Trim(); 
     string date = line.Split('=')[1].Trim(); 
     DateTime d = DateTime.ParseExact(date, "dd/MM/yy hh.mmtt", null); 
     if (line.StartsWith("break Start")) { 
      starts.Add(d); 
     } 
     else { 
      ends.Add(d); 
     } 
    } 

    starts = starts.OrderBy(x => x).ToList(); 
    ends = ends.OrderBy(x => x).ToList(); 

    for (int i = 0; i < starts.Count; i++) { 
     Console.WriteLine("break Start{0} = {1}", i + 1, starts[i].ToString("dd/MM/yy hh.mmtt")); 
     Console.WriteLine("break End{0} = {1}", i + 1, ends[i].ToString("dd/MM/yy hh.mmtt")); 
    } 

}