[英]How to Select then OrderBy using LINQ?
我正在嘗試根據較早發布的問題中的以下代碼,按照日期對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>
,這是我第一次使用它們。
訂購后添加Select
記錄,如下所示
var results = csvList
.Where(x => x.Grp == "DEFAULT")
.OrderBy(x => x.Date)
.Select(x => x.Grp);
雷迪的答案應該有用,但我會為您解釋,以便您理解為什么。
當您使用Select(x => x.Grp)
語句時,您不再具有IEnumerable<CSVEntry>
。 您只有csnumList中的所有Grp條目具有IEnumerable。 因此,當您嘗試通過添加OrderBy(x => x.Date)
語句按日期對它們進行排序時,Linq不知道Date屬性,因為在此語句中x只是一個字符串,而不是CsvEntry。
在Reddys Answer中,他首先通過Grp == "DEFAULT"
過濾所有條目。 之后,他還有一個IEnumerable<CsvEntry>
,因此他可以在x.Date之前對其進行訂購。 之后,他又剩下IEnumerable<CsvEntry>
。 僅在最后一條語句( Select(x => x.Grp)
語句)之后,他才剩下IEnumerable<string>
。
希望有幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.