У меня есть функция, которая принимает Enumerable.Мне нужно убедиться, что перечислитель вычислен, но я бы не стал создавать его копию (например, через ToList () или ToArray ()), если он все готов в List или какой-либо другой «замороженной» коллекции.Под «Замороженным» я подразумеваю коллекции, в которых набор элементов уже установлен, например, 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()}
}
}
После еще одного исследования я понял, что это почти невозможнов любом практическом смысле, и потребует сложной проверки кода каждого итератора.
Итак, я собираюсь пойти с вариантом ответа Марка и создать белый список известных безопасных типов и просто вызвать ToList ()все, чего нет, не занесено в белый список.
Спасибо всем за помощь.
Редактировать * После еще большего размышления я понял, что это эквивалентно проблеме остановки,Так очень невозможно.