2012-03-03 1 views
9

enter image description hereВозможно многократное перечисление IEnumerable?

Почему это так? как я могу это исправить?

+1

Все, кроме последнего скриншота и текста, просто отвлекают от реального вопроса. – usr

+1

Это очень похоже на http://stackoverflow.com/q/7244178/219583. Любой() будет считаться одним перечислением и агрегировать() в качестве второго. –

+9

Не публикуйте код как скриншоты - вставьте источник в вопрос. – Joe

ответ

14

Здесь нечего исправить. Any() будет перебирать перечисление, но останавливаться после первого элемента (после чего он возвращает true).

Несколько перечислений в основном проблема в двух случаях:

  • Производительность: Как правило, вы хотите, чтобы избежать несколько итераций, если вы может, потому что это медленнее. Это не применяется здесь, так как Any() будет просто подтвердите, что есть хотя бы один элемент и является необходимой проверкой для вас. Кроме того, вы не получаете доступ к удаленным/внешним ресурсам, а только к последовательности в памяти.

  • Перечисления, которые не могут повторяться более одного раза: например. получение товаров из сети и т. Д. - здесь также не применяется.

В качестве не Linq версии, нужно только повторять, как только вы могли сделать следующее:

bool foundAny= false; 
bool isEqual = true; 

if(f == null) 
    throw new ArgumentException(); 

foreach(var check in f) 
{ 
    foundAny = true; 
    isEqual = isEqual && check(p,p2); 
} 

if(!foundAny) 
    throw new ArgumentException(); 

return isEqual; 

Но, как уже отмечалось, в вашем случае это не делает разницы, и я будет идти с версией, которая более читаема для вас.

+1

Если это запрос базы данных, он будет выполняться дважды, как правило, полностью. – usr

+1

@usr: Согласен, я добавил это к первому случаю - в этом случае имеет значение, является ли это удаленным/внешним ресурсом или последовательностью в памяти – BrokenGlass

5

Метод Any может вызвать перечисление IEnumerable<T>, если у него нет другого способа определить результат. В некоторых случаях это может быть проблемой, например, если экземпляр IEnumerable<T> фактически является IQueryable<T>, что приведет к выполнению запроса базы данных или вызова веб-службы. Теперь, если это просто коллекция в памяти, это не проблема, потому что перечисление коллекции не будет иметь заметных побочных эффектов. И вообще, Any будет использовать свойство Count, если последовательность реализует ICollection<T>, поэтому он не будет вызывать перечисление.

 Смежные вопросы

  • Нет связанных вопросов^_^