2013-02-27 72 views
-1

我已經問了關於Sorting Date Time的另一個問題,並從其他用戶那裏獲得了幫助以傳遞我的值。我正在使用如下所示的for循環,但在這裏肯定是錯誤的,因爲代碼會逐個賦值而不是排序。排序日期時間只限於開始日期

public class Break 
{ 
    public DateTime MealStart { get; set; } 
    public DateTime MealEnd { get; set; } 
} 

我的主類

IList<DateTime> starts = new List<DateTime>(); 
IList<DateTime> ends = new List<DateTime>(); 
DateTime breakStart1 = new DateTime(2012, 02, 15, 12, 30, 00); // 15/02/12 12.30PM 
DateTime breakEnd1 = new DateTime(2012, 02, 15, 13, 30, 00); // 15/02/12 01.30PM 
DateTime breakStart2 = new DateTime(2012, 02, 15, 11, 00, 00); // 15/02/12 11.00AM 
DateTime breakEnd2 = new DateTime(2012, 02, 15, 12, 00, 00); // 15/02/12 12.00PM 
DateTime breakStart3 = new DateTime(2012, 02, 15, 12, 00, 00); // 15/02/12 12.00PM 
DateTime breakEnd3 = new DateTime(2012, 02, 15, 01, 00, 00); // 15/02/12 01.00PM 
starts.Add(breakStart1); 
starts.Add(breakStart2); 
starts.Add(breakStart3); 
ends.Add(breakEnd1); 
ends.Add(breakEnd2); 
ends.Add(breakEnd3); 
for (int i = 0; i < starts.Count; i++) 
{ 
    var breaks = new List<Break>() 
    { 
     //for (int j= 0; j<starts.Count; j++) 
     //{ 
     new Break() 
     { 
      MealStart = starts[i], 
      MealEnd = ends[i] 

     } 
     // } 
    }; 

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

我期待的結果類似下面

breakStart1 = 15/02/12 11.00AM 
breakEnd1= 15/02/12 12.00PM 
breakStart2 = 15/02/12 12.00PM 
breakEnd2= 15/02/12 01.00PM 
breakStart3 = 15/02/12 12.30PM 
breakEnd3= 15/02/12 01.30PM 

,但它是因爲for循環不。

+2

我沒有-1,因爲我認爲它可能會產生一個連鎖反應,可能會以你的聲望爲名。老兄,你想要做什麼? (確切!) – 2013-02-27 03:58:17

+0

@GY,我正準備做Corylulu發佈的答案,謝謝所有 – Usher 2013-02-27 04:01:19

+0

@Usher編輯的問題不值得讚賞,他確實顯示了代碼示例並解釋了他的問題(並修復了破碎的英語他之前發佈的:P)。所以我會鼓勵你去對付你的負面的降價。 – Corylulu 2013-02-27 04:03:43

回答

3

你永遠循環後創建breaks,你需要做的這個循環之外是這樣的:

IList<DateTime> starts = new List<DateTime>(); 
IList<DateTime> ends = new List<DateTime>(); 
DateTime breakStart1 = new DateTime(2012, 02, 15, 12, 30, 00); // 15/02/12 12.30PM 
DateTime breakEnd1 = new DateTime(2012, 02, 15, 13, 30, 00); // 15/02/12 01.30PM 
DateTime breakStart2 = new DateTime(2012, 02, 15, 11, 00, 00); // 15/02/12 11.00AM 
DateTime breakEnd2 = new DateTime(2012, 02, 15, 12, 00, 00); // 15/02/12 12.00PM 
DateTime breakStart3 = new DateTime(2012, 02, 15, 12, 00, 00); // 15/02/12 12.00PM 
DateTime breakEnd3 = new DateTime(2012, 02, 15, 01, 00, 00); // 15/02/12 01.00PM 
starts.Add(breakStart1); 
starts.Add(breakStart2); 
starts.Add(breakStart3); 
ends.Add(breakEnd1); 
ends.Add(breakEnd2); 
ends.Add(breakEnd3); 
List<Break> breaks = new List<Break>(); 
for (int i = 0; i < starts.Count; i++) 
{ 
    breaks.Add(new Break() 
    { 
     MealStart = starts[i], 
     MealEnd = ends[i] 
    }); 
} 
var ordered = breaks.OrderBy(s => s.MealStart); 
foreach (var ord in ordered) 
{ 
    System.Console.WriteLine(ord.MealStart); 
    System.Console.WriteLine(ord.MealEnd); 
} 
+0

打倒我吧:P – Corey 2013-02-27 03:56:21

+0

@Corylulu,謝謝你了 – Usher 2013-02-27 03:58:49

+0

@Usher沒問題。只要記住要清楚,並在這裏重點。以最簡單,最孤立的形式提供所有代碼(最好是可測試的)。並永遠記得選擇最佳答案:P – Corylulu 2013-02-27 04:01:03

2

由於@Corylulu打我的基本問題上衝,這裏有一個不同的方法,那就是稍短:

IEnumerable<Break> breaks = 
    starts.Zip(ends, (s, e) => new Break { MealStart = s, MealEnd = e }) 
    .OrderBy(b => b.MealStart); 

foreach (Break brk in breaks) 
    Console.WriteLine("Start: {0}\tEnd: {1}", brk.BreakStart, brk.BreakEnd); 

IEnumerable.Zip方法需要一個對IEnumerable S和一個轉換函數,併產生包含呼叫變換函數與每個輸入0的成員的結果IEnumerable的輸出。您可以在課程結束時將其轉換爲List<Break>,其中ToList()