IEnumerator 是否有“HasNext”方法?

2023-11-21

使用JavaIterators,我已经用过hasNext确定迭代是否有更多元素的方法(不消耗元素)——因此,hasNext就像一个“Peek“ 方法。

我的问题:有没有类似“hasNext" or "Peek" 具有 C# 泛型的方法IEnumerators?


不可以,但在 C# 中,您可以重复请求当前元素,而无需移至下一个元素。这只是一种不同的看待方式。

不会是这样too很难编写 C# 类来采用 .NET 风格IEnumerator并返回一个Java风格的Iterator。就我个人而言,我发现 .NET 风格在大多数情况下更容易使用,但我们就这样吧:)

编辑:好的,这完全未经测试,但我think它会起作用的。它至少可以编译:)

using System;
using System.Collections;
using System.Collections.Generic;

// // Mimics Java's Iterable<T> interface
public interface IIterable<T>
{
    IIterator<T> Iterator();
}

// Mimics Java's Iterator interface - but
// implements IDisposable for the sake of
// parity with IEnumerator.
public interface IIterator<T> : IDisposable
{
    bool HasNext { get; }
    T Next();
    void Remove();
}

public sealed class EnumerableAdapter<T> : IIterable<T>
{
    private readonly IEnumerable<T> enumerable;

    public EnumerableAdapter(IEnumerable<T> enumerable)
    {
        this.enumerable = enumerable;
    }

    public IIterator<T> Iterator()
    {
        return new EnumeratorAdapter<T>(enumerable.GetEnumerator());
    }
}

public sealed class EnumeratorAdapter<T> : IIterator<T>
{
    private readonly IEnumerator<T> enumerator;

    private bool fetchedNext = false;
    private bool nextAvailable = false;
    private T next;

    public EnumeratorAdapter(IEnumerator<T> enumerator)
    {
        this.enumerator = enumerator;
    }

    public bool HasNext
    {
        get
        {
            CheckNext();
            return nextAvailable;
        } 
    }

    public T Next()
    {
        CheckNext();
        if (!nextAvailable)
        {
            throw new InvalidOperationException();
        }
        fetchedNext = false; // We've consumed this now
        return next;
    }

    void CheckNext()
    {
        if (!fetchedNext)
        {
            nextAvailable = enumerator.MoveNext();
            if (nextAvailable)
            {
                next = enumerator.Current;
            }
            fetchedNext = true;            
        }
    }

    public void Remove()
    {
        throw new NotSupportedException();
    }

    public void Dispose()
    {
        enumerator.Dispose();
    }
}

public sealed class IterableAdapter<T> : IEnumerable<T>
{
    private readonly IIterable<T> iterable;

    public IterableAdapter(IIterable<T> iterable)
    {
        this.iterable = iterable;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return new IteratorAdapter<T>(iterable.Iterator());
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public sealed class IteratorAdapter<T> : IEnumerator<T>
{
    private readonly IIterator<T> iterator;

    private bool gotCurrent = false;
    private T current;

    public IteratorAdapter(IIterator<T> iterator)
    {
        this.iterator = iterator;
    }

    public T Current
    {
        get
        {
            if (!gotCurrent)
            {
                throw new InvalidOperationException();
            }
            return current;
        }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }

    public bool MoveNext()
    {
        gotCurrent = iterator.HasNext;
        if (gotCurrent)
        {
            current = iterator.Next();
        }
        return gotCurrent;
    }

    public void Reset()
    {
        throw new NotSupportedException();
    }

    public void Dispose()
    {
        iterator.Dispose();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IEnumerator 是否有“HasNext”方法? 的相关文章

随机推荐

  • 调用 stringWithFormat 时,长期使用哪个正确的说明符?

    我有这段运行良好的代码 但我不知道这是否是调用 stringWithFormat 的正确方法 因为在文档中 d 代表 int 并且我传递了一个 long long seconds long NSDate date timeIntervalS
  • 使用 R 制作动画 gif [重复]

    这个问题在这里已经有答案了 有人对用 R 制作 GIF 动画有什么建议吗 我正在尝试制作一些延时地图 GIF 重复问题 请参阅之前的 StackOverflow 问题在 R 中创建一系列绘图它提供了许多解决方案 包括指向其他 有用包的指针
  • 使用元组作为参数列表调用方法[重复]

    这个问题在这里已经有答案了 我想知道最好的方法是什么 val foo Some a val bar Some 2 def baz a String b Int if b 2 0 Some a b else None x zip y flat
  • 如何在 Rust 中使用参数重载或可选参数?

    我正在尝试为二叉树编写一个打印函数 这是迄今为止我所拥有的 impl TreeNode fn print self self print 0 fn print self level u8 for i in range 0 level pri
  • 将每个字典值转换为 utf-8(字典理解?)

    我有一本字典 我想将每个值转换为 utf 8 这可行 但是有没有 更Pythonic 的方法 for key in row keys row key unicode row key encode utf 8 对于我可以做的清单 unicod
  • jquery 获取选中复选框

    我正在尝试获取复选框列表和已检查的计数 我有这个 var obj this closest li find checkbox var childCount obj size var checkedCount obj checked leng
  • 数据库中所有表的列表

    如何使用查询获取 SQL Server 数据库中所有表的列表 我的目的是在网页上动态显示它 Try SELECT name from sys tables 这应该会给你你想要的 然后 您需要从网页调用它以按所需格式显示 您可能想查看 如何使
  • BASH 不以防万一

    我正在尝试找出一种合理的方法来在案例中执行 NOT 子句 我这样做的原因是为了 遇到情况时进行转码 也就是说 如果我击中了 avi 没有理由再次将其转为 avi 我可以 只需将其移开 这就是我的案例底部的范围 should做 无论如何 我有
  • HttpWebRequest 非常慢!

    我正在使用开源库连接到我的网络服务器 我担心网络服务器运行速度极慢 然后我尝试在 Ruby 中进行简单的测试 得到了这些结果 Ruby 程序 10 个 HTTP 需要 2 11 秒 获取 Ruby 程序 100 个 HTTP 需要 18 1
  • 在 azure cdn 上托管字体 - CORS 支持

    我无法在 IE 或 Firefox 中通过 azure cdn 公开 azure blob 存储托管字体 我相信这是因为 font face 跨域问题 CORS 正常的解决方案是添加 Access Control Allow Origin
  • 我是否需要为 CDC 设备编写自己的主机端 USB 驱动程序

    这可能不被认为与编程直接相关 但我不知道还能问哪里 我尝试过浏览各种网站 但到目前为止 谷歌还不是我的朋友 我无法确定是否需要为我正在开发的设备可能连接的各种 windows linux mac 平台编写自己的设备驱动程序 或者该功能是否由
  • 如何使用 PHP 以编程方式构建 APR1-MD5

    很像这个问题我想从 PHP 生成 htpasswd 文件条目 然而 正如原始答案中提到的 答案没有显示如何实现 APR1 风格 它需要是 APR1 Apache 风格 才能与 mod dav svn 一起使用 我似乎找不到可以创建密码的有效
  • 故事板中的 initWithNibName 方法

    我正在按照 Facebook 的教程发布到用户的墙上 http developers facebook com docs howtos publish to feed ios sdk 尽管它是根据 xib 项目制作的 但到目前为止 我的故事
  • 发送投票电子邮件

    使用 Outlook API 可以通过在 MailItem 实例上设置 VotingOpions 属性来发送带有民意调查的电子邮件 是否可以以任何方式对 Exchange Web 服务执行相同的操作 Microsoft 已经发布了投票电子邮
  • 在Python中将点后的浮点四舍五入到2位数字

    我正在使用这段代码 f 0 3223322 float 2f f 有没有更Pythonic 更简洁的方法 无需两次转换 使用round文档中的以下注释令人沮丧 round 对于浮点数的行为可能会令人惊讶 例如 round 2 675 2 给
  • 在 pandas MultiIndex 前面添加一个级别

    我有一个 DataFrame 其中经过一些分组后创建了 MultiIndex import numpy as np import pandas as pd from numpy random import randn df pd DataF
  • 如何使用mockito验证公共类的静态方法被调用?

    伪代码是这样的 rc SomePublicClass myPublicStaticFunc arg public class SomePublicClass private SomePublicClass public static int
  • 创建过程中忽略 Config.xml

    我在使用命令行工具时遇到问题科尔多瓦 cli 我遵循了从文档 cordova create test com test 测试 在这一步中我要更改的内容www folder 1 将示例网页移至src文件夹 所以内容www are www co
  • git 子模块添加致命错误:不是 Git 存储库

    我对 Git 相当陌生 并尽力寻找有关此问题的一些文档 但无济于事 这是我的命令 git submodule add https github com joliver EventStore git externalsource JOlive
  • IEnumerator 是否有“HasNext”方法?

    使用JavaIterators 我已经用过hasNext确定迭代是否有更多元素的方法 不消耗元素 因此 hasNext就像一个 Peek 方法 我的问题 有没有类似 hasNext or Peek 具有 C 泛型的方法IEnumerator