Безопасно ли использовать IEnumerable для чего-то, что может быть перечислено несколько раз? - PullRequest
2 голосов
/ 10 марта 2020

Например, допустим, у меня есть следующее:

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 безопасны только для одного перечисления? Если нет, какой тип лучше использовать в таком случае?

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

не определено относительно того, может ли IEnumerable<T> повторяться в общем случае. Часто (обычно): это так. Однако существуют примеры, что либо:

  • может быть повторен только когда-либо один раз (представьте, что "данные из сокета")
  • можно повторять много раз, но каждый раз давать совершенно разные данные (без соответствующей очевидной мутации состояния)

Итак: в общем, я бы не советовал повторять их более одного раза , если только вы не знаете, что сценарий повторяется . Такие вещи, как массивы и списки, повторяются (если данные изменяются, конечно, они могут измениться, чтобы показать эти изменения).

0 голосов
/ 10 марта 2020

Это должно быть безопасно, но не может быть оптимальным. Дьявол находится в реализации.

IEnumerable вызывает GetEnumerator(), который возвращает IEnumerator, который реализует функцию Reset().

Как эта функция реализована, это может вызвать некоторые проблема. Если вы перечислите массив, вызывающий Reset(), то просто установите его внутренний указатель на -1, и он готов снова перечислить.

Если вы перечисляете что-то, подключенное по сети, вам, возможно, придется повторить весь процесс подключения и снова запросить данные, которые будут более длинными и неоптимальными при использовании более одного раза.

...