2017-11-14 16 views
-2

おはようございます。Linqリストの並べ替えに問題があります

私は異なる理由でインデックスを作成したいクラスのリストを持っています。一つは異なる時間に異なる順序でデータを読みたいということです。私が抱えている問題は、私がLINQで並べ替えることができないということです。

私は私のリストを持っているクラスが(これは小さいバージョンです)

List<SalesRecord> Records = new List<SalesRecord>(); 
class SalesRecord 
{ 
    public Int16 SalesID { get; set; } 
    public Int32 Invoice { get; set; } 
    public DateTime BookoutDate { get; set; } 
} 

レコードのカウントサイズはおよそ50万

私の考えは、リストのカップルを作成していたこれに似ていますそれは特定の順序でレコードの各項目を参照することになる

例:

List<int> BookoutDateIndex; 
List<int> InvoiceIndex; 

Records[BookoutDateIndex[0]].BookoutDate // Oldest date 
Records[BookoutDateIndex[1]].BookoutDate // Second oldest date 
             // etc 
私が見てきた情報、私はほとんど私が欲しいものないことを発見した最も近いがこれですに基づいて3210

...

// Copy dates to new list 
List<DateTime> BookoutDates = new List<DateTime>(); 

for (int salesRecordIndex = 0; salesRecordIndex < records.Count; salesRecordIndex++) 
    BookoutDates.Add(Records[salesRecordIndex].BookoutDate); 

// Sort list 

var sorted = Indexes.BookoutDates 
    .Select((x, i) => new KeyValuePair<DateTime, int>(x, i)) 
    .OrderBy(x => x.Key) 
    .ToList(); 

これは動作しますが、私は指数の実際の日付をしたいと私はありませんあらかじめ新しいリストに日付をコピーする必要はありません。

私はこれがAccessデータベースのようなものにデータをロードすることで簡単になると思っていますが、私はデータベースオプションなしでそれを行うことをお勧めします。

ご協力いただければ幸いです。

+0

''インデックスに実際の日付が欲しいのではないですか? 'そして、結果のリストで何をしたいですか?私はあなたが達成しようとしていることを理解していません。単に 'BookoutDate'で' records'を注文したいのであれば、 'records.OrderBy(r => r.BookoutDate)'とするだけです。あなたはそれとは違うものを明確にすることができますか? – David

+0

は実際にこれを過度に複雑にしているようです。ちょうど 'Records.OrderBy'あなたが必要なもの – reckface

+0

最後のデータを保持したいもの、または〜500kレコードの2つのリストが必要な理由がわからない場合は、元のリストをオーダーに並べ替えるのが一番良いと思いますあなたがその順序でそれを必要とするとき。 – d219

答えて

1

きっとあなただけ欲しい:あなたが何をしたいの

var sorted = Records 
    .OrderBy(x => x.BookoutDate) 
    .ToList(); 
+0

私はこれを試したことから、リスト全体を新しい変数にコピーします。私が探しているものではありません。 –

+1

Linqでは、これらの拡張メソッドは新しいEnumerableを返します。これをレコードなどに割り当てることができます。しかし、あなたの例では、すべてをある種のリストにコピーして、KeyValueのペアのリストを作成しています。これははるかに簡単です。 – reckface

2

概要:メインリストにいくつかのフィールドでソートされたメインリストのインデックスのリストを?

LINQのOrderByが実際に入力を変更しないと、人はあなたで終わる:

var sorted = Indexes.BookoutDates 
        .Select((x, i) => new KeyValuePair<DateTime, int>(x, i)) 
        .OrderBy(x => x.Key) 
        .ToList(); 

匿名型があろうとあなたは割り当てを減らすために値型(KeyValuePair)を使用しています持って来なさい。しかし、あなたが最初に必要とする日付だけの別のリストを作成する必要はありません。基本的なリストから始めるだけです。

KeyValuePairKeyプロパティは、の最初のコンストラクタパラメータです。

var sorted = Records 
    .Select((r, x) => new KeyValuePair<DateTime, int>(r.BookoutDate, x)) 
    .OrderBy(x => x.Key) 
    .Select(x => x.Value) 
    .ToList(); 
+0

あなたの要約は正しいです。しかしあなたの答えは私にとってはうまくいかない。 –

+0

@ GrantMcConville:どのように動作しないのですか? – Richard

+0

あなたの要約は正しいです。しかしあなたの答えは私にとってはうまくいかない。 2行目は、SalesRecordからSystem.DateTimeに変換できないエラーで、intにはBookoutDateの定義が含まれていません。 –

関連する問題