本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而不是界面,因为它避免拳击,我需要切出.
好的,让我们从这个非常简单的按钮点击方法开始吧
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) 我正在使用扩展名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)
我觉得我在这里做的事很傻,任何帮助都会受到赞赏!
我正在练习在二叉搜索树上删除节点,并且我使用空模式为空链接(NullNode)创建了一个特殊类型,因此我可以为"null"类型添加一些理想的行为.两个节点类型和Nullnode类型共享相同的INODE接口,其中包括递归方法.
该索引节点接口包括IEnumerable的递归方法POR预购,序和后序遍历,但是我不想NullNode返回任何元素(通过产量return语句).
我能做什么?
我知道我可以使用一个不可能的if条件,然后在方法中放一个yield return语句,但我不认为这个解决方案是好的.应该有一个更好的方法.
我有一个函数,以下列方式生成枚举器:
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枚举器重置为它的起始值.有没有一种很好的方法可以在使用无限枚举器的同时做到这一点?
学习集合和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) 我最近开始阅读"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会暂时离开循环块?
为什么这会返回nil,第2行是什么意思?该数组代表一个Sudoku难题的行,我正在尝试为其创建解决方案.
我在irb中尝试不同的方法来查看我可以查看数组的不同方法.
array = ['015003002000100906270068430490002017501040380003905000900081040860070025037204600']
array.each_slice(9) { |e| puts e.map }
#<Enumerator:0x0000010288a470>
=> nil
Run Code Online (Sandbox Code Playgroud) 枚举常量的类型是什么,当它在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)
现在,如果我只能改变一些其他枚举的值,begin来2147483648,那么我的输出变为:
true
4
4294967197
Run Code Online (Sandbox Code Playgroud)
显然,这意味着,这种类型end已经从int变为unsigned int,甚至基础类型modes仍然是相同的(即unsigned int).
关于枚举的整体促销是否有一些特殊规则?
我在某些序列中间有一个枚举器:
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 中循环如此行?
enumerator ×10
c# ×5
ruby ×4
.net ×2
iterator ×2
yield-return ×2
c++ ×1
collections ×1
enumeration ×1
enums ×1
for-loop ×1
generics ×1
ienumerator ×1
interface ×1
methods ×1
queue ×1
reverse ×1
yield ×1