2011-10-14 8 views
8

LINQを使用してアイテムを投影するときに、「自動インクリメント」スタイルのインデックス列(1..x以降)を提供する良い方法はありますか?C#でLINQを使用して汎用リストを自動インクリメントする

基本的な例として、私は1からリスト内の項目の数になるように下のインデックス列を探しています。

var items = from s1 in list 
    select new BrowsingSessionItemModel { Id = s1.Id, Index = 0 }; 

リストを反復するのは簡単なオプションですが、これを行うより良い方法があるかどうか疑問に思っていましたか?

+0

一般的に、Enumerable.Range(1、numOfItems)を使用して新しいインクリメント用の列挙型を生成できますが、必要に応じてSelect overloadが最適なオプションを使用しています。 –

答えて

13

これはLINQ式では実行できません。あなたはしかし、次の.Select拡張メソッドを使用することができます。

var items = list.Select((x, index) => new BrowsingSessionItemModel { 
    Id = x.Id, 
    Index = index 
}); 
+0

答えをありがとう。 – Nick

+0

0ではなく1から始めるのが最も効率的な方法は何でしょうか? – Nick

+2

'Index = index + 1'です。 –

7

をあなたが同様の突起にインデックスを提供しとるoverload of Selectを使用することができます。

var items = list.Select((value, index) => new BrowsingSessionItemModel { 
               Id = value.Id, 
               Index = index 
              }); 

ノートには、クエリ式のサポートがないことこの過負荷。実際にデータベースから値をフェッチしている場合(listが実際にList<T>であるかどうかは不明です)、適切な順序付けがあるかどうかを確認する必要があります。そうでなければ、結果は多少恣意的です。

関連する問題