【发布时间】:2022-01-15 05:51:56
【问题描述】:
在批量转换列表时,yield return 会跳过已在 if 条件下签入但由于大小限制未添加到存储桶中的对象。
消息总数:4
第一个桶数:2
第二桶数:1
消息列表中的第三条消息被跳过。
在这里,我正在创建大小为 250kb 的存储桶。还有其他方法可以保存正确的状态还是我需要使用 for 循环?
public static IEnumerable<IEnumerable<Message>> GetBatchSize(IList<Message> source)
{
List<Message> bucket = null;
long size = 0;
foreach (var item in source)
{
if (bucket == null)
{
bucket = new List<Message>();
}
size = size + item.Size;
if (250 - (size / 1024) >= item.Size / 1024)
{
bucket.Add(item);
continue;
}
yield return bucket;
bucket = new List<Message>();
size = 0;
}
if (bucket?.Count > 0 && size<250)
{
yield return bucket;
}
}
【问题讨论】:
标签: c# .net recursion c#-4.0 yield-return