Операции LINQ не должны иметь побочных эффектов или выполнять какие-либо действия.Они должны использоваться только для производства IEnumerable<T>
другого IEnumerable<T>
(или IQueryable<T>
другого IQueryable<T>
или IEnumerable<T>
) (или при агрегировании, например .Max
, .All
... aодин результат)
Прочитайте, например, http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx.
(и обратите внимание, что этот вопрос довольно задан на SO ... Прочитайте, например, мой ответ здесь ToList (). ForEach inLinq и посмотрите решение аналогичной проблемы)
Теперь, если вы достаточно ненавидите себя, вы можете сделать это:
strs.Select((p, index) =>
{
Console.WriteLine("#" + index + " " + "<" + p + ">");
return true;
}).All(p => p);
Мы используем .All(p => p)
to "материализовать "операцию Select
.Это потому, что Select
является «ленивым» и не будет выполняться, если его никто не будет повторять.
Технически вы можете даже попытаться немного запутать его:
strs.Select((p, index) =>
{
Console.WriteLine("#" + index + " " + "<" + p + ">");
return false;
}).Any(p => p);
(All
проверяет, что все элементы равны true
, и останавливается, если один из элементов равен false
, поэтому он должен циклически переключать все из них (потому что мы всегда return true;
). Any
(как написано) проверяет, что хотя бы одиниз элементов true
и затем останавливается (но все наши элементы false
, потому что мы делаем return false;
, поэтому Any
будет циклически повторять все элементы)
Теперь ... Преимуществоиз этих методов по сравнению с ToList
мы не «дублируем» Array
на List<T>
просто для использования «неправильного» метода List<T>
. Если ForEach
метод List<T>
«неправильно», дублируя Array
до List
, просто чтобы использовать его вдвойне неправильно.