将项目分为csv的一批数字

时间:2012-11-14 17:17:13

标签: c# linq

我有一个项目列表,例如

  

ID   1   2   3   4   五   6   7   8   9   10   11   12   13

我想将此写入csv并分批进行,因此当它达到id 5时,它将转到下一批。我正在考虑做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,无论有多少。

希望它足够清楚。

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:1)

您可以执行以下操作

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

这将按指数除以5对ID进行分组,因为它们是整数,所以它将下限。所以前5个项的'GID'为0,接下来的5个将有1,依此类推。