如何创建字符串或整数的枚举器/生成器?

Joa*_*nge 0 .net c# collections ienumerable

我希望有一个枚举器/生成器,每当我调用GetNext时,它总会为我提供下一个值?这可能吗?

Examples:

myStringEnumerator.GetNext()
  -> returns "Identifier01.xml"
myStringEnumerator.GetNext()
  -> returns "Identifier02.xml"
myStringEnumerator.GetNext()
  -> returns "Identifier03.xml"
myStringEnumerator.GetNext()
  -> returns "Identifier04.xml"
myStringEnumerator.GetNext()
  -> returns "Identifier05.xml"
...

evenNumberGenerator.GetNext()
  -> returns 0
evenNumberGenerator.GetNext()
  -> returns 2
evenNumberGenerator.GetNext()
  -> returns 4
evenNumberGenerator.GetNext()
  -> returns 6
evenNumberGenerator.GetNext()
  -> returns 8
evenNumberGenerator.GetNext()
  -> returns 10
...
Run Code Online (Sandbox Code Playgroud)

我不会在一个地方进行迭代,而是在许多地方和非常不同的时间进行迭代.

我该如何以最优雅的方式做到这一点?如果它也快,那也很好.

Rex*_*x M 5

术语"枚举器"在这里有点误导,因为这是一种具有开始和结束的特定类型的序列.在你的情况下,你不会按照每个说法枚举任何东西,而只是无限期地推进到下一个值.听起来像单身人士的好用:

class NextNumberGenerator
{
    private static NextNumberGenerator instance = new NextNumberGenerator();

    public static NextNumberGenerator Current
    {
        get { return instance; }
    }

    private int currentNumber = 0;

    public int GetNext()
    {
        return ++currentNumber;
    }

    public int GetNextEven()
    {
        currentNumber++;
        return (currentNumber % 2 == 0) ? currentNumber : ++currentNumber;
    }

    public int GetNextOdd()
    {
        currentNumber++;
        return (currentNumber % 2 != 0) ? currentNumber : ++currentNumber;
    }
}
Run Code Online (Sandbox Code Playgroud)

用作:

int value = NextNumberGenerator.Current.GetNext();
Run Code Online (Sandbox Code Playgroud)

编辑:一些评论者指出,完全有可能使用IEnumerable.但是,我认为这是对IEnumerable的误用,仅仅是因为这种情况和这种情况在某些方面看似相似,但却不一样.使用一个非常具体,有目的的界面,因为它所做的多件事中的一件与你需要的东西相似(不相同)会回来咬你.

  • Rex:也许我误解了你,但我不确定Matthew的评论是如何"绕过IEnumerable模式的一部分".IEnumerable并不强制要求结束,并且无限枚举器非常有用,因为它们允许调用代码强加其自己的终止条件,而不是将其烘焙到枚举器中.例如foreach(BigInteger p in AllPrimes().Where(p <= maxValue)){...}.AllPrimes()枚举器永远不会"破坏"; 调用代码只是停止枚举它. (2认同)