我有一个项目列表,例如
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,无论有多少。
希望它足够清楚。
答案 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,依此类推。