我试图将List<T>
转换为BlockingCollection<T>
,这是我的代码..
List<Job> jobs = new List<Job>
{
new Job() {Id=Guid.NewGuid(), Name="test1" },
new Job() {Id=Guid.NewGuid(), Name="test2" },
new Job() {Id=Guid.NewGuid(), Name="test3" },
};
BlockingCollection<Job> coll = jobs as BlockingCollection<Job>;
并且Job
类被定义为..
public class Job
{
public Guid Id { get; set; }
public string Name { get; set; }
}
这种类型的铸造似乎不起作用。有没有更简单,更高效的方法将List<T>
转换为BlockingCollection<T>
而不循环遍历列表并明确地将每个列表项添加到集合中?
答案 0 :(得分:11)
BlockingCollection<T>
提供了一个接受IProducerConsumerCollection<T>
的构造函数。因此,您可以利用具有高效IProducerConsumerCollection<T>
复制机制的IEnumerable<T>
实施,例如ConcurrentQueue<T>
。
List<Job> jobs = new List<Job> {
new Job { Id = Guid.NewGuid(), Name = "test1" },
new Job { Id = Guid.NewGuid(), Name = "test2" },
new Job { Id = Guid.NewGuid(), Name = "test3" },
};
BlockingCollection<Job> col = new BlockingCollection<Job>(new ConcurrentQueue<Job>(jobs));
这避免了与逐个添加项目相关联的(相当重要的)锁定开销。