如何使用LINQ进行选择和排序?

8
我正在尝试使用以下代码按照日期对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".

...

但是我得到了这个错误:

'string'不包含名称为'Date'的定义,也没有接受类型为'string'的第一个参数的扩展方法'Date'被找到。

我的输出需要是其他列中的字符串按时间顺序排序。当我尝试使用以下代码显示日期时:

var results = csvList.Where(x => x.Grp == "DEFAULT").OrderBy(x => x.Date);

它可以完美地按照日期的先后顺序排序输出。但是这次我不想显示日期,而是想显示上面提到的其他列中的字符串。我尝试使用了

var results = csvList.Select(x => x.Grp).OrderBy(x => x.Date);

但是我仍然得到了相同的错误。我错在哪里了?我是LINQ的新手,对于List<T>IEnumerable<T>不熟悉,这是我第一次使用它们。


1
把你的Select放在OrderBy之后,而不是之前。 - Evk
请检查您的CSV日期格式和DateTime.ParseExact(col[7], "dd/MM/yyyy", null)日期格式。 - Mostafiz
我运行了你上面的示例代码,对我来说它很好用,所以正如Mostafizur所说,也许你的数据有些奇怪?出错的那一行将x视为字符串而不是应该是CSVEntry。你能给我们展示一下你的“using”语句吗? - Ste Griffiths
你确定第一个示例代码块是准确的吗?var results = csvList.OrderBy(x => x.Date);不应该抛出异常,因为csvList是IEnumerable<CSVEntry>。 - bkqc
2个回答

19
在您的订单记录之后添加“Select”,如下所示:

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

var results = csvList
    .Where(x => x.Grp == "DEFAULT")
    .OrderBy(x => x.Date)
    .Select(x => x.Grp);

6

Reddy的答案应该是可行的,但我会为您解释一下,以便您了解其原因。

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

在Reddys答案中,他首先通过Grp ==“DEFAULT”过滤所有条目。 之后,他还剩下一个IEnumerable<CsvEntry>,因此他可以通过x.Date对它们进行排序。 接下来,他再次剩下一个IEnumerable<CsvEntry>。 只有在最后一个语句Select(x => x.Grp)之后,他才剩下一个IEnumerable<string>

希望这有所帮助 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接