将项目划分为一批数字以进行 csv



我有一个项目列表,例如

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

我想将其写入 csv 并以 5 为批次进行,因此当它达到 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,无论有多少个 id。

希望它足够清楚。

以下内容将从枚举中返回给定大小的批处理:

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));
}

你可以执行以下操作

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

这将按索引除以 5 对 id 进行分组,因为它们是整数。 因此,前 5 个项目的"GID"为 0,接下来的 5 个项目的"GID"为 1,依此类推。

最新更新