标签: enumerator

接口实现和返回类型

List<T>类实现了IEnumerable<T>接口.它有一个GetEnumerator返回a 的方法List<T>.Enumerator.

我有一个如下所示的类,它给出了一个编译错误,指出返回类型GetEnumerator与接口不匹配.

public class InsertionSortedSet<T> : IEnumerable<T>
{
    public struct Enumerator : IEnumerator<T>
    {
        // Required interface implemented
    }

    // Other interface methods implemented

    public Enumerator GetEnumerator()
    {
        return new Enumerator(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

'Entities.Helpers.InsertionSortedSet'未实现接口成员'System.Collections.Generic.IEnumerable.GetEnumerator()'.'Entities.Helpers.InsertionSortedSet.GetEnumerator()'无法实现'System.Collections.Generic.IEnumerable.GetEnumerator()',因为它没有匹配的返回类型'System.Collections.Generic.IEnumerator'.

鉴于它List<T>似乎返回它自己的Enumerator类(不是接口),但它确实实现了Enumeration<T>我很困惑的接口,因为我看不出我对那个类有什么不同.

我的设置有什么问题导致它失败,哪里List<T>有效?


我想返回一个InsertionSortedSet<T>.Enumerator而不是界面,因为它避免拳击,我需要切出.

c# generics interface enumerator

4
推荐指数
1
解决办法
1418
查看次数

枚举器作为参数

好的,让我们从这个非常简单的按钮点击方法开始吧

    private void button1_Click(object sender, EventArgs e)
    {
        int counter = 1;
        List<int> items = new int[] { 1, 2, 3 }.ToList();
        List<int>.Enumerator enm = items.GetEnumerator();

        // 1
        if (!enm.MoveNext())
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter)
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        // 2
        if (!enm.MoveNext()) 
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter) 
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        //3
        if (!enm.MoveNext())
            throw new Exception("Unexpected …
Run Code Online (Sandbox Code Playgroud)

.net c# ienumerator enumerator

4
推荐指数
1
解决办法
430
查看次数

反转队列

我正在使用扩展名menthod Reverse(),但它似乎没有做任何事情.MSDN声明它是作为延迟执行实现的,但我似乎无法使其工作.

我就是这样称呼的.

        Queue<T> currentPath = new Queue<T>();
        currentPath.Enqueue(someValue);
        currentPath.Enqueue(someValue2);

        currentPath.Reverse();
Run Code Online (Sandbox Code Playgroud)

这就是MSDN所说的:

此方法通过使用延迟执行来实现.立即返回值是一个对象,它存储执行操作所需的所有信息.在通过直接调用其GetEnumerator方法或在Visual C#中使用foreach或在Visual Basic中使用For Each来枚举对象之前,不会执行此方法表示的查询.

我不确定调用GetEnumerator意味着什么.我试过这个,只是做了以下无济于事:

currentPath.Reverse();
currentPath.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

我觉得我在这里做的事很傻,任何帮助都会受到赞赏!

.net c# queue reverse enumerator

4
推荐指数
1
解决办法
8425
查看次数

如何产生return语句返回没有元素?

我正在练习在二叉搜索树上删除节点,并且我使用空模式为空链接(NullNode)创建了一个特殊类型,因此我可以为"null"类型添加一些理想的行为.两个节点类型和Nullnode类型共享相同的INODE接口,其中包括递归方法.

索引节点接口包括IEnumerable的递归方法POR预购,序和后序遍历,但是我不想NullNode返回任何元素(通过产量return语句).

我能做什么?

我知道我可以使用一个不可能的if条件,然后在方法中放一个yield return语句,但我不认为这个解决方案是好的.应该有一个更好的方法.

c# methods iterator enumerator yield-return

4
推荐指数
1
解决办法
494
查看次数

无限枚举者倒带

我有一个函数,以下列方式生成枚举器:

def create_example_enumerator(starting_value)
  current = starting_value
  e = Enumerator.new do |y|
    loop do
      current += 1
      y << current
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

目前的行为非常简单.

> e = create_example_enumerator(0)
#<Enumerator: details>
> e.next
1
> e.next
2
> e.rewind
#<Enumerator: details>
> e.next
3
Run Code Online (Sandbox Code Playgroud)

我想将e.rewind枚举器重置为它的起始值.有没有一种很好的方法可以在使用无限枚举器的同时做到这一点?

ruby enumerator

4
推荐指数
1
解决办法
257
查看次数

使用yield return时GetEnumerator()方法会发生什么?

学习集合和IEnumerable和IEnumerator接口.我有以下程序.我什么时候进入

IEnumerator<string> name = sample.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

它称之为 Console.WriteLine("inside getenumerator");

class Program
    {
        static void Main(string[] args)
        {
            SampleStrings sample = new SampleStrings();
            IEnumerator<string> name = sample.GetEnumerator();
            foreach (var item in sample)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }
    }
    class SampleStrings : IEnumerable<string>
    {
        public IEnumerator<string> GetEnumerator()
        {
            Console.WriteLine("inside getenumerator");

            return null;//for testing purpose only
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,如果我在IEnumerator<string> name = sample.GetEnumerator(); 调用相同内容时将GetEnumerator替换为如下所示,则它不会进入该函数.我希望它能进入这个功能,但不会返回任何东西,因为我还没有打电话movenext().当我指定使其以这种方式运行的产量时发生的事情.该计划有效.

public IEnumerator<string> GetEnumerator()
        {
            Console.WriteLine("inside getenumerator");
            yield return "First";
            yield return "Second"; …
Run Code Online (Sandbox Code Playgroud)

c# collections enumerator yield-return

4
推荐指数
1
解决办法
3534
查看次数

枚举器yielder.yield VS Proc.yield

我最近开始阅读"Programming Ruby 1.9&2.0"一书.它显示了显式枚举器的技巧

triangular_numbers = Enumerator.new do |yielder|
number = 0
count = 1
    loop do
        number += count
        count += 1
        yielder.yield number
    end
end
5.times { print triangular_numbers.next, " " }
puts
Run Code Online (Sandbox Code Playgroud)

我想知道为什么这个yielder.yield会暂时离开循环并返回number的值,直到创建下一个枚举器对象.它似乎与循环块内的产量的通常情况不同.我查看了APIdock,发现Proc.yield()的源代码与Proc.call()相同.对于Enumerator类中的Yielder对象,Yielder已覆盖yield().但是为什么yielder.yield会暂时离开循环块?

参考: APIdock Yielder yield(), Ruby MRI rb_proc_call

ruby yield enumerator

4
推荐指数
1
解决办法
838
查看次数

为什么带有块和.map的each_slice返回nil

为什么这会返回nil,第2行是什么意思?该数组代表一个Sudoku难题的行,我正在尝试为其创建解决方案.

我在irb中尝试不同的方法来查看我可以查看数组的不同方法.

array = ['015003002000100906270068430490002017501040380003905000900081040860070025037204600']
array.each_slice(9) { |e| puts e.map }
#<Enumerator:0x0000010288a470>
=> nil
Run Code Online (Sandbox Code Playgroud)

ruby enumerator

4
推荐指数
1
解决办法
4026
查看次数

表达式中使用的枚举数是否与其枚举的基础类型具有相同的类型?

枚举常量的类型是什么,当它在unscoped枚举定义之外使用时?

考虑以下代码:

#include <iostream>

enum modes
{
    begin = 0,
    end = 1
};

int main()
{
    std::cout << std::boolalpha
        << std::is_same<unsigned int, typename std::underlying_type<modes>::type>::value
        << std::endl;
    std::cout << sizeof(modes) << std::endl;
    std::cout << (-100 + end) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这在我的机器上产生:

true
4
-99
Run Code Online (Sandbox Code Playgroud)

现在,如果我只能改变一些其他枚举的值,begin2147483648,那么我的输出变为:

true
4
4294967197
Run Code Online (Sandbox Code Playgroud)

显然,这意味着,这种类型end已经从int变为unsigned int,甚至基础类型modes仍然是相同的(即unsigned int).

关于枚举的整体促销是否有一些特殊规则?

c++ enums enumeration enumerator integer-promotion

4
推荐指数
1
解决办法
122
查看次数

在Ruby中遍历其余的Enumerator

我在某些序列中间有一个枚举器:

enum = (1..9).each
first = enum.next
second = enum.next
Run Code Online (Sandbox Code Playgroud)

现在,我要遍历序列的其余部分(3..9个数字)。但是看似显而易见的解决方案(例如在python中工作)从序列的开头而不是第三项重新开始:

for item in enum
    puts item
end
# prints 1..9 instead of 3..9
Run Code Online (Sandbox Code Playgroud)

我发现工作解决方案似乎很丑陋:

begin
    while item=enum.next
        puts item
    end
rescue StopIteration
end
Run Code Online (Sandbox Code Playgroud)

那么问题来了:是否有更好的红宝石解决方案可以做到这一点?为什么for在Ruby 中循环如此行?

ruby iterator for-loop enumerator

4
推荐指数
1
解决办法
389
查看次数