Я пытаюсь понять поведение ParallelEnumerable.Zip()
в сочетании с IEnumerable<T>
и AsEnumerable()
.
С учетом приведенного ниже кода parallelResult
и result
не будут одинаковыми.Предполагая, что ParallelEnumerable.Zip()
означает, что я просто хочу объединить элементы в случайном порядке, что имеет смысл.Но если я раскомментирую AsEnumerable()
, parallelResult.ShouldBe(result)
больше не выбрасывает, даже для очень больших n
и повторных прогонов.Если оба входа List
s, утверждение также проходит.
Какое поведение ожидается?Мы полагаемся на детали реализации при вызове AsEnumerable()
?
int n = 200;
IReadOnlyList<double> list = Enumerable.Range(0, n).Select(x=>(double)x).ToList();
IEnumerable<double> enumerable = Enumerable.Range(10, n).Select(x => (double)x);
var result = list
.Zip(enumerable, Tuple.Create)
.OrderBy(x=>x.Item1)
.ThenBy(x=>x.Item2)
.ToList();
var parallelResult = list
.AsParallel()
.Zip(enumerable.AsParallel(), Tuple.Create)
// .AsEnumerable()
.OrderBy(x => x.Item1)
.ThenBy(x => x.Item2)
.ToList();
parallelResult.ShouldBe(result);
Я пытался прочитать документацию , но и источник , но это не таксделай меня мудрееОсобенно трудно понять исходный код (что ожидается с высоко оптимизированным параллельным кодом).