如何将concurrentbag转换为列表

本文关键字:列表 转换 concurrentbag | 更新日期: 2023-09-27 17:58:20

我几乎没有可以并行完成的任务。由于列表不是线程安全的,我正在使用concurrentbag。一旦所有任务完成,我想将concurrentbag转换为列表。

我在MSDN中搜索过,但找不到任何可以将concurrentbag转换为c#中的列表的API。我该怎么做?

注意:我必须转换到列表,这是必要的。

我还有其他选项可以在列表上应用锁,但我想在构建concurrentbag时使用它,它是线程安全的。

如何将concurrentbag转换为列表

您可以使用ToList扩展方法。

var list = concurrentBag.ToList();

ConcurrentBag具有.ToList()的扩展方法-它实现了IEnumerable<T>

var someList = someConcurrentBag.ToList();

ConcurrentBag有ToList()方法。

如果您的内部项目未列出,则使用

var someList = someConcurrentBag.ToList();

或者,如果cbag中的每个项目都已经是一个列表,您可以尝试如下。

例如,在我的案例中ConcurrentBag<List<int>>

ConcurrentBag<List<string>> jobErrorsColl = new ConcurrentBag<List<string>>();
// Got something in jobErrorsColl
List<string> multipleJobErrors = new List<string>();
List<string> singleJobErrors = new List<string>();
while (jobErrorsColl.IsEmpty)
{
    jobErrorsColl.TryPeek(out singleJobErrors);
    multipleJobErrors.AddRange(singleJobErrors);
}
return multipleJobErrors;  

MSDN链接位于此处,用于相同的

您可以使用以下命令将concurrentbag转换为列表:

var list = = someConcurrentBag.SelectMany(r => r).ToList();