Как сочетать предметы из двух ConcurrentBags? - PullRequest
0 голосов
/ 02 апреля 2020

Для List s я мог бы использовать метод Union:

var finalCollection = new List<MyType>();
var list1= new List<MyType>();
var list2 = new List<MyType>();
finalCollection = list1.Union(list2).ToList();

Но когда я пытаюсь сделать то же самое с ConcurrentBag s,

var finalCollection = new ConcurrentBag<MyType>();
var bag1= new ConcurrentBag<MyType>();
var bag2= new ConcurrentBag<MyType>();
finalCollection = bag1.Union(bag2);

I get:

Невозможно неявно преобразовать тип "System.Collections.Generi c .IEnumerable " в "System.Collections.Concurrent.ConcurrentBag"

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Возможно, проблема в том, что вы пытаетесь объединить элементы в новый ConcurrentBag

То, что вы фактически получаете после объединения, это IEnumerable из MyType

. назад ConcurrentBag попробуйте сделать это так:

var bag1 = new ConcurrentBag<MyType>();
var bag2 = new ConcurrentBag<MyType>();
var finalCollection = new ConcurrentBag<MyType>(bag1.Union(bag2));
1 голос
/ 02 апреля 2020

var in ...

var finalCollection = new ConcurrentBag<MyType>();

... может скрывать, в чем проблема. Расширение его (мысленно или явно) до ...

ConcurrentBag<MyType> finalCollection = new ConcurrentBag<MyType>();

... должно прояснить, почему bag1.Union(bag2), который возвращает IEnumerable<MyType>, нельзя присвоить finalCollection. Обратите внимание, что в Visual Studio (код) при наведении указателя мыши на ключевое слово var всплывающая подсказка покажет вам предполагаемый тип переменной.

Кроме того, ваши два фрагмента кода не совсем "одинаковы"; в первом вы вызываете ToList() для создания List<> из результата Union(), а во втором вы пытаетесь присвоить результат Union() непосредственно переменной ConcurrentBag<>, не делая ничего для фактического сделать это a ConcurrentBag<>, который другой ответ показывает, как это сделать. Если вы удалите .ToList() из первого фрагмента кода, вы получите похожую ошибку.

...