当前位置: 首页 > 知识库问答 >
问题:

收益返回保存迭代器的下一个状态

尹雅健
2023-03-14

在成批转换列表时,yield return跳过已签入if条件但由于大小限制而未添加到bucket的对象。

消息总计数: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;
        }
    }

共有2个答案

东门俊智
2023-03-14

(假设没有单个消息的大小大于桶大小)

首先,当当前bucket不能包含当前消息时,您应该将消息放入下一个bucket,而不是将其丢弃。因此,在foreach循环中返回收益率后,您应该执行以下操作:

bucket = new() { item };
               ^^^^^^^^

此外,您向桶中添加物品的条件不正确。它“双重计算”当前项目的大小。请注意,size此时已经有了项。大小已添加到其中!此外,在此处使用除法将丢弃余数,这将导致在以下情况下产生不正确的结果:

GetBatchSize(new List<Message> {
    new Message { Size = 250 * 1024 - 1 },
    new Message { Size = 1 },
    new Message { Size = 1 },
});

与其除法,不如乘:

if (size <= 250 * 1024)
{
    bucket.Add(item);
    continue;
}     

另外,我不确定最后一个大小的目的是什么

if (bucket?.Count > 0)
{
    yield return bucket;
}

夏谦
2023-03-14

您可以将项目添加到收益返回后新创建的列表中:

foreach (var item in source)
{
   // omitted for brevity
   yield return bucket;
   bucket = new List<Message> { item };
   size = item.Size;
}
 类似资料:
  • 我有一个返回: 然后另一个用户这样使用它: 如何处理任何迭代中的失败情况? 我知道我可以使用,在这种情况下,错误结果将被忽略: 的迭代器根据成功状态具有0或1项,如果为0,将过滤掉它。 但是,我不想忽略错误,而是想让整个代码块停止并返回一个新错误(基于映射中出现的错误,或者只是转发现有错误)。 在Rust中如何最好地处理此问题?

  • 将这些视为对象: 查看java文档,对于LinkedList类,LinkedList类中没有迭代器方法的实现,但是,实现是在AbstractSequentialList类中。 listIterator()方法在AbstractList类中实现,AbstractSequentialList的父类,总结一下,如果我没弄错的话,它返回一个不使用节点概念的迭代器对象。 但是方法是在LinkedList类中

  • 我正在尝试研究java单词计数示例。据我所知,spark RDD是一种特殊类型的集合,而flat map基本上转换一个嵌套的集合(比如Stream>=>Stream),那么为什么下面一行中的spark Java API需要为每一行返回一个迭代器呢?如何在RDD中使用? 函数不是应该在arrays.aslist(line.toString().split(“”))结束吗?

  • 使用web3.eth.getCoinbase()方法获取当前接收挖矿奖励的账户地址。 调用: web3.eth.getCoinbase([callback]) 返回值: 一个Promise对象,其解析值为接收挖矿奖励的账户地址字符串,20字节长。 示例代码: web3.eth.getCoinbase().then(console.log); > "0x11f4d0A3c12e86B4b5F39B

  • 我可以看到返回。但是现在已经添加到C++20标准中,为什么返回?cppreference指定: 返回值 等于last的迭代器。 这个选择背后的理性是什么? 与相比,用例的优势是什么?

  • 我正在学习使用节点进行后端开发。js和mongodb。Mongoose有一个方法<code>模型。保存(函数(err,model))由于某些原因无法保存文档时必须返回的状态代码。 在代码方面: