「迴歸」根本不會在這裏工作(因爲它會嘗試返回BigInt
和方法聲明的IEnumerable<BigInt>
。喬恩斯基特具有迭代器塊的一個很好的寫了(這是什麼)在免費章C# in Depth 6(當時買整本書 - 這真的是值得;-p)
編輯 - 這裏有一個非常粗糙版本的你會做什麼爲了寫這個你rself;注意它不完全相同,但是達到了目標。我想你會同意yield return
版本更容易!
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
static class Program
{
static void Main()
{
IEnumerable<int> source = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
foreach (int value in EvenNumbers(source))
{
Console.WriteLine(value);
}
}
public static IEnumerable<int> EvenNumbers(IEnumerable<int> numbers)
{
return new EvenEnumerable(numbers);
}
class EvenEnumerable : IEnumerable<int>
{
private readonly IEnumerable<int> numbers;
public EvenEnumerable(IEnumerable<int> numbers) {
this.numbers = numbers;
}
public IEnumerator<int> GetEnumerator()
{
return new EvenEnumerator(numbers);
}
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
class EvenEnumerator : IEnumerator<int>
{
private readonly IEnumerable<int> numbers;
public EvenEnumerator(IEnumerable<int> numbers)
{
this.numbers = numbers;
}
private int current;
void IEnumerator.Reset() { throw new NotSupportedException(); }
public int Current { get { return current; } }
object IEnumerator.Current { get { return Current; } }
IEnumerator<int> iter;
public bool MoveNext()
{
if (iter == null) iter = numbers.GetEnumerator();
while (iter.MoveNext())
{
int tmp = iter.Current;
if (tmp % 2 == 0)
{
current = tmp;
return true;
}
}
return false;
}
public void Dispose()
{
if (iter != null)
{
iter.Dispose();
iter = null;
}
}
}
}
感謝您的。我讀過Skeet的網站,我會通過閱讀他的書來讚美這一點。應該幫助很多。 – dotnetdev 2009-02-17 23:54:47