2016-05-12 53 views
1

我有是這樣的一個CSV文件:LINQ無法在特定列中訂購日期?

1,01/01/2001,a 
2,19/09/2013,as 
3,12/05/2016,asd 
4,13/05/2016,asdf 
5,12/12/2012,asdfg 
6,05/02/2006,asdfgh 
7,06/03/2011,asdfghj 

我想排序和按時間順序顯示的日期,但我似乎無法讓我的代碼來梳理出來。但是,我的代碼能夠根據CSV文件中的格式顯示日期。

如果CSV文件是這樣的:

01/01/2001 
19/09/2013 
12/05/2016 
13/05/2016 
12/12/2012 
05/02/2006 
06/03/2011 

然後,它工作得很好。

下面是我的代碼:

string parts = new StreamReader(@"C:\input.txt").ReadToEnd(); 
string[] file = parts.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); 
StringBuilder sb = new StringBuilder(); 

for (int i = 0; i < file.Length; i++) 
{ 
    string[] data = file[i].Split(new string[] { "," }, StringSplitOptions.None); 
    string[] dates = new string[] { data[1].ToString() }; 
    //var date = dates.OrderBy(x => DateTime.Parse(x)).ToList(); 
    var date = dates.OrderBy(x => DateTime.ParseExact(x, "dd/MM/yyyy", null)); 

    foreach (string s in date) 
    { 
     sb.AppendLine(s + "<br />"); 
     Label1.Text = sb.ToString(); 
    } 
} 

我已經測試CSV文件同時使用DateTime.ParseDateTime.ParseExact這個代碼,但他們沒有工作。

我是LINQ查詢的新手,這是我第一次使用它。如果有關於我的代碼有什麼問題的解釋,我會非常感激。

+0

我想,你需要用逗號分割你的文件,然後按行日期列排序。 – SeM

+0

發佈預期標籤文本與實際標籤文本。你的意思是什麼沒有奏效?用於排序的linq代碼似乎沒問題。 – user6144226

+1

這裏的問題是你正在排序'每行'而不是排序所有行。 – user6144226

回答

3

要排序的數組(dates)移動的Label1文本指定始終包含一個日期(因爲您每次從循環中的一行創建它)。然後,將此行添加到標籤的文本中。

在排序之前,您必須創建一個包含所有日期的集合。

string parts = new StringReader(@"C:\input.txt").ReadToEnd(); 
string[] lines = parts.Split(new string[] {Environment.NewLine}, StringSplitOptions.None); 
StringBuilder sb = new StringBuilder(); 
List<string> dates = new List<string>(); 
for (int i = 0; i < lines.Length; i++) 
{ 
    string[] data = lines[i].Split(new string[] { "," }, StringSplitOptions.None); 
    dates.Add(data[1]); 
} 

var datesSorted = dates.OrderBy(x => DateTime.ParseExact(x, "dd/MM/yyyy", null)); 
foreach (string s in datesSorted) 
{ 
    sb.AppendLine(s + "<br />"); 
} 

Label1.Text = sb.ToString(); 
+0

非常感謝您的解答和解決方案! – user6234613

1

它可能需要選擇日期格式值第一則責令其 嘗試

var date = dates.Select(x => DateTime.ParseExact(x, "dd/MM/yyyy", null)).OrderBy(t => t).ToList(); 
foreach (DateTime s in date) 
{ 
    sb.AppendLine(s.ToString("dd/MM/yyyy") + "<br />"); 
} 
Label1.Text = sb.ToString(); 

需要後foreach

0

請首先將您的日期放入一個集合中,例如List或Array,然後對集合進行排序。默認排序順序是升序

 List<string> unsortedDates = new List<string>(); 

     string parts = new StreamReader(@"C:\input.txt").ReadToEnd(); 
     string[] file = parts.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < file.Length; i++) 
     { 
      string[] data = file[i].Split(new string[] { "," }, StringSplitOptions.None); 
      unsortedDates.Add(data[1]); 
     } 

     var sortedDatesAscending = unsortedDates.OrderBy(x => DateTime.ParseExact(x, "dd/MM/yyyy", null)); 

     foreach (string s in sortedDatesAscending) 
     { 
      sb.AppendLine(s + "<br />"); 
      Label1.Text = sb.ToString(); 
     }