1

リストに行番号とセット番号を割り当てようとしていますが、1つのセットに間違った行数が含まれているセット番号です。

 var objx = new List<x>();
            var i = 0;
            var r = 1;


            objY.ForEach(x => objx .Add(new x 
                                                  {
                                                      RowNumber = ++i,
                                                      DatabaseID= x.QuestionID,
                                                      SetID= i == 5 ? r++ : i % 5 == 0 ? r += 1 : r
                                                  }));

objYのような上記のコードの場合23行が含まれており、5〜5セットで23行を分割したいと思います。したがって、上記のコードは次のようなシーケンスを提供します[ RowNumberのみを考慮]

[1 2 3 4 5][6 7 8 9][ 10 11 12 13 14 ].......

ロジックによって有効であり、Setidのロジックを次のように変更した場合

 SetID= i % 5 == 0 ? r += 1 : r

結果は次のようになります

[1 2 3 4 ][5 6 7 8 9][10 11 12 13 14].

再びコードの正しい出力

しかし、5つのセットが期待されます。

[1 2 3 4 5][ 6  7 8 9 10].........

私が欠けているもの............。

私は数学の授業を非常に真剣に受けるべきでした。

4

1 に答える 1

2

私はあなたがこのようなものが欲しいと思います:

var objX = objY.Select((x, i) => new { ObjX = x, Index = i })
    .GroupBy(x => x.Index / 5)
    .Select((g, i) => 
        g.Select(x => new objx
        {
            RowNumber = x.Index + 1
            DatabaseID = x.ObjX.QuestionID,
            SetID = i + 1
        }).ToList())
    .ToList();

x.Index / 5すべてのグループに5つのアイテムがあることを確認するために、グループ化していることに注意してください。

ここにデモがあります。

アップデート

あなたの論理を説明できるなら、それは非常に役に立ちます

どこから始めればよいですか?Linq メソッドを使用して、元のリストを選択してグループ化し、すべての内側のリストに最大 5 つの要素がある新しいリストを作成していList<List<ObjX>>ます (合計数が 5 で割り切れない場合は、最後に少ない)。

Enumerable.Select入力シーケンスから何かを投影して新しいものを作成することができます。このメソッドは、ループ内の変数に相当します。この場合、元のオブジェクトとリスト内のそのインデックスを使用して匿名型を投影します(インデックスを組み込むオーバーロードSelectがあります)。この匿名型を単純にクエリに作成します。これは、後で GroupBy`` でインデックスが必要になるためです。

Enumerable.GroupBy指定したキーによってシーケンス内の要素をグループ化できます。このキーは、要素から派生できるものなら何でもかまいません。ここでは、最大サイズ 5 のインデックス 2 ビルド グループを使用しています。

.GroupBy(x => x.Index / 5)

これは、C# (または C) での整数除算が常に になりint、剰余が (VB.NET btw とは異なり) 切り捨てられるため、3/4 が 0になるためです。この事実を利用して、指定したサイズのグループを構築できます。

次に、グループを使用して内部リストを作成します。これも、インデックス オーバーロードを使用してグループSelectを設定できるようにします。SetId

.Select((g, i) => 
    g.Select(x => new objx
    {
        RowNumber = x.Index + 1
        DatabaseID = x.ObjX.QuestionID,
        SetID = i + 1
    }).ToList())

最後のステップでは、ToListonを使用しIEnumerable<List<ObjX>>て最終的な を作成しますList<List<ObX>>。それはまた、クエリを「具体化」します。詳細については、遅延実行、特にJon Skeets ブログをご覧ください。

于 2013-02-07T16:50:47.310 に答える