2015-05-26 5 views
5

Для жизни я не могу понять, почему все foos не равны нулю. Я предполагаю, что .ForAll() должен выполняться до того, как я вызову метод .All(), но это не так?Параллельный LINQ - .Select() + .ForAll(), возвращающий причудливые результаты

public class Foo 
{ 
    public string Bar { get; set; } 
} 

static void Main(string[] args) 
{ 
    var foos = new List<Foo> { new Foo(), new Foo(), new Foo() }; 
    var newFoos = foos 
     .AsParallel() 
     .Select(x => 
     { 
      x.Bar = ""; 
      return x; 
     }); 
    newFoos.ForAll(x => x = null); 
    var allFoosAreNull = newFoos.All(x => x == null); 
    Console.WriteLine(allFoosAreNull); // False ?? 
} 

ответ

7

Когда вы сделаете это

newFoos.ForAll(x => x = null); 

вы назначая null к x, который является параметром вашего лямбда. x является локальным для лямбда. Это не параметр ref, и присвоение ему значений не имеет эффекта вне его тела. Эффективно эта строка ничего не делает.

+0

Даже если я изменяю тело лямбды, чтобы установить свойство «Bar» другому значению, это значение также не сохраняется. Я все еще немного озадачен; Я полагаю, что 'ForAll()' выполняет итерирование по фактическому списку. Другими словами, почему лямбда * не * была 'ref'? –

+0

Теперь, когда я думаю об этом, это даже не имеет никакого отношения к PLINQ ... это такое же поведение с '.ForEach()'. –

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