Я понимаю, что IEnumerable
может столкнуться с риском для возврата разных результатов при многократном запуске. Но это все еще проблема, если мы уверены, что базовый набор записей никогда не изменится между ними, и последовательность цикла не имеет значения вообще?Выполнение Перечислимое несколько раз, если источник данных остается неизменным
Сложно позвонить по телефону ToList
/ToArray
всюду без каких-либо соображений, что это всего лишь «возможный» риск. R # или VS могут просто отметить это как ошибку, если этого не должно было случиться.
Действительно ли это не исключение? Мы никогда не должны повторять IEnumerable несколько раз?
Это то, что на самом деле произошло. В однопоточной среде.
void Main()
{
var result = GetFile(new [] {path1, path2}) // hardcoded path
}
IList<SomeFile> GetFiles(IEnumerable<string> filePaths)
{
var paths = filePaths.ToArray(); // <-- why we have to do this ?
foreach(var path In paths)
// Throw exception if the path not exist.
foreach (var path In paths)
// Process and return a list of file
}
Я понимаю, что это делает не так много разницы, как коллекция настолько мала, но мы находимся в самом начале реализации проекта, необходимый для борьбы с большой коллекцией статических данных. Подобная практика может быть большой проблемой, если она применима ко всем областям без учета того, необходимо ли это или нет.
_ "и последовательность цикла вообще не имеет значения" _ что это значит? В общем, может быть безопасно всегда перечислять его, если исходный источник не изменится, возможно, он даже будет желателен, но он всегда будет стоить. Если это просто переменная, кто-то может переусердствовать, что она еще не «материализовалась». Поместите запрос в метод, и вы не получите предупреждение resharper. –
Можете ли вы привести конкретный пример того, что вы описываете? Иногда вызов '.ToList()' также несет в себе риск, если вы материализуете из более медленного источника данных большое количество записей, которые не понадобятся. – David
Если ваш код не работает с индексаторами и вообще нет, тогда нет реальной причины при вызове 'ToList()' или 'ToArray()', поскольку в большинстве случаев это приведет к множественному перечислению 'IEnumerable'. Также стоит упомянуть, что эти методы создают * copy * базового перечисляемого, и если вам это не нужно, то это плохая идея. – Fabjan