对可能被枚举多次的东西使用 IEnumerable 是否安全?

Is it safe to use IEnumerable for something that may be enumerated multiple times?

例如,假设我有以下内容:

public class StringTester
{
    IEnumerable<IStringConditional> Conditionals { get; }

    public StringTester(IEnumerable<IStringConditional> conditionals)
    {
        conditionals = Conditionals;
    }

    public bool TestString(string testString)
    {
        foreach (var conditional in Conditionals)
        {
            if (!conditional.Test(testString))
            {
                return false;
            }
        }

        return true;
    }
}

这被认为是安全的,还是 IEnumerable 类型仅对单个枚举安全?如果不是,在这种情况下最好使用哪种类型?

一般情况下IEnumerable<T>是否可重复未定义。通常(通常):是。但是,存在这样的例子:

  • 只能永远迭代一次(想想"data from a socket")
  • 可以迭代多次,但每次给出的数据完全不同(没有任何对应的明显状态突变)

所以:一般来说,我不建议重复它多次除非你知道这个场景是可重复的。数组和列表之类的东西是可重复的(如果数据发生变化,当然,它们可能会发生变化以显示这些变化)。

它应该是安全的,但可能不是最佳的。魔鬼在实施中。

IEnumerable 调用 GetEnumerator(),其中 returns 一个实现 Reset() 函数的 IEnumerator

这个功能的实现方式可能会导致一些问题。如果您正在枚举一个调用 Reset() 的数组,只需将其内部指针设置为 -1 即可再次枚举。

如果您要枚举通过网络连接的内容,您可能需要重做整个连接过程并再次查询数据,如果多次使用,数据会更长且次优。