【问题标题】:LINQ unable to OrderBy date in specific column?LINQ 无法在特定列中按日期排序?
【发布时间】:2016-05-12 11:03:59
【问题描述】:

我有一个 CSV 文件,格式如下:

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 查询非常陌生,这是我第一次使用它。如果对我的代码有什么问题提供解释,我将不胜感激。

【问题讨论】:

  • 我想,你需要用逗号split你的文件,然后按日期列排序。
  • 发布预期标签文本与实际标签文本。你是什​​么意思它没有工作?用于排序的 linq 代码似乎没问题。
  • 这里的问题是你正在对“每行”进行排序,而不是对所有行进行排序。

标签: c# asp.net .net linq


【解决方案1】:

您正在对始终包含一个日期的数组 (dates) 进行排序(因为您每次都从循环中的一行创建它)。然后将此行添加到标签的文本中。

在对它进行排序之前,您必须创建一个包含所有日期的集合。

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();

【讨论】:

  • 非常感谢您的解释和解决方案!
【解决方案2】:

可能需要先选择日期格式的值,然后再排序 试试看

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后面需要移动Label1 Text赋值

【讨论】:

    【解决方案3】:

    请先将您的日期放入一个集合中,例如列表或数组,然后对集合进行排序。默认排序顺序是升序

            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();
            }
    

    【讨论】:

      猜你喜欢
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      相关资源
      最近更新 更多