1

私はアイテムのリストを持っています例えば

id 1 2 3 4 5 6 7 8 9 10 11 12 13

これをcsvに書き込み、5のバッチで実行したいので、ID5に達すると次のバッチに進みます。私はこれに対応するためにmodを行うことを考えていたので

int noOfIds = MyIDList.Count % 5; // to get the number of loops i need

List<MyIDList> topFiveID = (from c in MyIDList
                select c).Take(5).ToList(); // get top 5 from the list

それから私は残りを取得しています

List<MyIDList> restOfIDs = MyIDList.Where(c => !topFiveID.Any(tc => tc.ID == c.ID)).ToList();

これで最大9つのIDに対応できることがわかりました。誰かが、いくつあるかに関係なく、すべてのIDに対応する方法を教えてください。

それが十分に明確であることを願っています。

4

2 に答える 2

3

以下は、列挙から指定されたサイズのバッチを返します。

public static IEnumerable<IEnumerable<TSource>> Batch<TSource>(
    this IEnumerable<TSource> source,
    int batchSize)
{
    var batch = new List<TSource>();
    foreach (var item in source)
    {
        batch.Add(item);
        if (batch.Count == batchSize)
        {
             yield return batch;
             batch = new List<TSource>();
        }
    }

    if (batch.Any()) yield return batch;
}

次のように使用されます:

foreach (var list in MyIdList.Batch(5))
{
    // list is an IEnumerable<T> containing up to 5 items
    Console.WriteLine("{0}", String.Join(",", list));
}
于 2012-11-14T17:23:49.147 に答える
1

あなたは次のことができます

MyGroupedIDs = MyIDList.Select((v, i) => new {GID = i/5; Value = v})
                       .GroupBy(p => p.GID);

これにより、IDが5で割ったインデックスでグループ化されます。これはintであるためフロアになります。したがって、最初の5つのアイテムの「GID」は0になり、次の5つのアイテムの「GID」は1になります。

于 2012-11-14T17:51:33.127 に答える