2009-05-13 14 views
15

私はこの作業をして、誰かがアイデアを持っていることを望む方法を見つけることができません。単純化された例では整数1〜100のリストがあり、3行ごとにグループ化したいので、結果は最初のグループで1,2,3、次のグループでは4,5,6などとなります。 n番目のレコードをすべて取得しますが、必要なものはすべてのレコードですので、最初、最後、合計、最大などを使用して集計できます。Linqを使用してN行ごとにグループ分けする方法

ありがとう!

+0

が重複する可能性(http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) – nawfal

答えて

22
var q = Enumerable.Range(0, 100).GroupBy(x => x/3); 

私に何か不足していますか?

+2

ありませんが、私は明らかにしています。私は睡眠不足です。どうもありがとう!!! – RBear

+0

ペタンティックである - Enumerable.Range(1、100)。1から開始したいからです。 –

+0

最初の数字が0の場合、正常に動作します。しかし、最初の数が1の場合、最初のグループには1つの要素が少なくなります。例えば{0,1,2}、{3,4,5}、しかし{1,2}、{3,4,5}。これを修正するには? –

29

この例は、数値以外のコレクションを照会する場合に有効です。グループ化するオブジェクトにインデックスを投影し、グループ化中にインデックスを再度削除します。

var index = 0; 
var grpOf3s = students.GroupBy(x => index++/3); 

更新:あなたはグループ項目のKey値を使用している なら、あなたはリストに列挙グループを変換する必要があります単純なアプローチについてどのように

var studentQuery2 = students 
    .Select((student, index) => new {student, index}) 
    .GroupBy(g => g.index/3, i => i.student); 
+0

ありがとうございますが、インデックスはどこから来たのですか? – RBear

+0

私はselectがそのインデックスをクエリに投影することを望んでいました。それはそうではないように見えます。私はそれに応じて例を更新します。そうすれば、非intベースのコレクションで使用することができます。 –

+6

FYI、フレームワークの次のバージョンでは、 "zip join"拡張メソッドがあります。無限の整数のシーケンスでクエリ結果を圧縮すると、インデックス付きのシーケンスが得られます。詳細については、この件に関する私の最近のブログ記事を参照してください。 –

1

。それ以外の場合は、アクセスするたびに異なるKeyが表示されます。 [LINQでのサブリストに分割リスト]の

var index = 0; 
var grpOf3s = students.GroupBy(x => index++/3).ToList(); 
関連する問題