如何将ConcurrentBag转换为List?

12

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

我在MSDN中搜索过,但无法找到任何可在C#中将concurrentbag转换为list的API。我该怎么做?

注意: 我必须转换为list,这是必要的。

我还可以在列表上应用锁定,但我想使用内置的concurrentbag,因为它是线程安全的。


3
阅读 msdn 有多难?它实现了 IEnumerable<>,使用 LINQ 的 ToList() 方法可以获取列表。 - Sinatr
@Sinatr 是时候在 SO Documentation Beta 上举个例子了;-) - Uwe Keim
你的类中是否添加了 using System.Linq?你必须能够使用.ToList()。 - Ashkan S
@Suri - 你用答案解决了它吗? - Gilad Green
ToList 对我来说返回的是一个 List 的集合,而不是预期的 List。所以这有点奇怪。 - Piotr Kula
5个回答

20
你可以使用 ToList 扩展方法。
var list = concurrentBag.ToList();

7

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

var someList = someConcurrentBag.ToList();

3

ConcurrentBag有ToList()方法。


2
如果你的内部项目不是列表,则使用


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链接(点击此处),与此相关的是it技术。


0
您可以使用以下代码将ConcurrentBag转换为List:
var list = = someConcurrentBag.SelectMany(r => r).ToList();

2
虽然这段代码片段可能是解决方案,但包括解释真的有助于提高您的帖子质量。请记住,您正在回答未来读者的问题,而这些人可能不知道您的代码建议原因。 - gogaz
上面标记的注释...如果它是“最”有用的帖子,那么看起来很傻。 - Seabizkit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接