У меня есть функция, которая принимает Enumerable. Мне нужно убедиться, что счетчик оценивается, но я не хочу его копировать (например, через ToList() или ToArray()), если он готов в списке или какой-либо другой "замороженной" коллекции. По Frozen я имею в виду коллекции, в которых набор элементов уже установлен, например. List, Array, FsharpSet, Collection и т.д., В отличие от элементов linq, таких как Select() и where().
Возможно ли создать функцию "ForceEvaluation", которая может определить, выполнил ли перечислимое событие ожидаемое выполнение, а затем вычислил перечислимый?
public void Process(IEnumerable<Foo> foos)
{
IEnumerable<Foo> evalutedFoos = ForceEvaluation(foos)
EnterLockedMode(); // all the deferred processing needs to have been done before this line.
foreach (Foo foo in foos)
{
Bar(foo);
}
}
public IEnumerable ForceEvaluation(IEnumerable<Foo> foos)
{
if(??????)
{ return foos}
else
{return foos.ToList()}
}
}
После еще нескольких исследований я понял, что это практически невозможно в любом практическом смысле и потребует комплексного проверки кода каждого итератора.
Итак, я собираюсь пойти с вариантом ответа Mark и создать белый список известных безопасных типов и просто вызвать ToList() что-то не на том, что не в белом списке.
Спасибо всем за вашу помощь.
Изменить * После еще большего размышления я понял, что это эквивалентно проблеме остановки. Это очень невозможно.