如何使用 LINQ 选择然后 OrderBy?

use*_*613 4 .net c# linq asp.net

我正在尝试使用之前发布的问题中的以下代码根据日期对 CSV 文件的内容进行排序:

private class CSVEntry
{
    public DateTime Date { get; set; }
    public string Grp { get; set; }
}

...

List<CSVEntry> csvList = new List<CSVEntry>();

csvList.Add(new CSVEntry() { Date = DateTime.ParseExact(col[7], "dd/MM/yyyy", null), Grp = col[9] });

var results = csvList.OrderBy(x => x.Date); // An error occurs at "Date".

...
Run Code Online (Sandbox Code Playgroud)

但我收到了这个错误:

“string”不包含“Date”的定义,并且找不到接受“string”类型的第一个参数的扩展方法“Date”。

我想要的输出是来自其他列但按时间顺序排序的字符串。当我尝试使用此代码显示日期时:

var results = csvList.Where(x => x.Grp == "DEFAULT").OrderBy(x => x.Date);
Run Code Online (Sandbox Code Playgroud)

它与输出完美配合,因为日期按时间顺序排序。但是,这次我不想显示日期。我想像我上面提到的那样显示来自其他列的字符串。我尝试使用

var results = csvList.Select(x => x.Grp).OrderBy(x => x.Date);
Run Code Online (Sandbox Code Playgroud)

但也得到了同样的错误。我哪里错了?我是 LINQ 的新手,不熟悉List<T>and IEnumerable<T>,这是我第一次使用它们。

Raj*_*ddy 12

Select在您的订单后添加记录,如下所示

var results = csvList
    .Where(x => x.Grp == "DEFAULT")
    .OrderBy(x => x.Date)
    .Select(x => x.Grp);
Run Code Online (Sandbox Code Playgroud)


小智 5

雷迪的回答应该有效,但我会为你解释,所以你明白为什么会这样。

当您使用Select(x => x.Grp)Statement 时,您将不再拥有 a IEnumerable<CSVEntry>。您只有一个包含 csvList 中所有 Grp-Entrys 的 IEnumerable。因此,当您尝试通过添加OrderBy(x => x.Date)语句按日期对它们进行排序时,Linq 不知道日期属性,因为在此语句中 x 只是一个字符串,而不是 CsvEntry。

在 Reddys Answer 中,他首先按 过滤所有条目Grp == "DEFAULT"。之后他有一个IEnumerable<CsvEntry>左,所以他可以按 x.Date 订购它们。在那之后,他还有一个IEnumerable<CsvEntry>左边。只有在最后一个Statement之后,Select(x => x.Grp)Statement,他才有了IEnumerable<string>左边。

希望有帮助:)