2016-05-13 10 views
0

私はquestion以前の投稿から、次のコードで自分の日数に応じて、CSVファイルの内容を並べ替えるしようとしています:LINQを使用してOrderByを選択する方法は?

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' does not contain a definition for 'Date' and no extension method 'Date' accepting a first argument of type 'string' could be found.

何I出力を他の列の文字列にしたいが、時間順にソートする。このコードを使用して日付を表示しようとしたとき:

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

あなたの前にセレクトボタンを押してください。 – Evk

+0

あなたはcsvの日付フォーマットと 'DateTime.ParseExact(col [7]、" dd/MM/yyyy "、null)の日付フォーマットをチェックアウトします – Mostafiz

+0

私はあなたのサンプルコードを上から走らせました。あなたのデータについて何か奇妙なことがありますか?エラーのある行は、CSVEntryの代わりに文字列として 'x'を認識しています。 'using'ステートメントを見せてもらえますか? –

答えて

2

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

以下のようにレディの答えは動作するはずですが、それがない理由を理解して、私は、あなたのためにそれを説明します。、ご注文の記録後Selectを追加します。

Select(x => x.Grp)ステートメントを使用すると、IEnumerable<CSVEntry>はもうありません。あなたはあなたのcsvListからの全てのGrp-Entryを持つIEnumerableしか持っていません。ですから、OrderBy(x => x.Date) Statementを追加してDateによってそれらを注文しようとすると、このStatement xはCsvEntryではなく文字列であるため、LinqはDateプロパティを知らないのです。

Reddys Answerでは、彼は最初にすべてのエントリをGrp == "DEFAULT"でフィルタリングします。その後、彼はIEnumerable<CsvEntry>が残っているので、x.Dateで注文することができます。その後、再び彼はIEnumerable<CsvEntry>を残しています。最後の声明の後で、Select(x => x.Grp)ステートメント、彼はIEnumerable<string>を残しています。

希望するもの:

関連する問題