Это все факторы вплоть до этой единственной строки:
Parallel.ForEach(itemList.Where(i => i.Foo), DoStuff);
Но, читая комментарий к другому посту, я теперь вижу, что вы находитесь в .Net 2.0, поэтому некоторые из них могут быть немного сложными, чтобы пробраться мимо компилятора.
Для .Net 2.0 я думаю вы можете сделать это следующим образом (мне немного непонятно, что передача имен методов в качестве делегатов все равно будет работать, но я думаю, что это будет):
public IEnumerable<T> Where(IEnumerable<T> source, Predicate<T> predicate)
{
foreach(T item in source)
if (predicate(item))
yield return item;
}
public bool HasFoo(Item item) { return item.Foo; }
Parallel.ForEach(Where(itemList, HasFoo), DoStuff);