2016-05-04 12 views
2

は私が変換リスト<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クラスは次のように定義されます。.. BlockingCollection<T>List<T>を変換しようとここに私のコードですよ..

public class Job 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

この型キャストのdoesnうまくいきません。 List<T>BlockingCollection<T>に変換するのは、リストをループせずに明示的に各リストアイテムをコレクションに追加することなく、より簡単で効率的な方法ですか?

答えて

5

BlockingCollection<T>は、IProducerConsumerCollection<T>を受け入れるコンストラクタを提供する。したがって、ConcurrentQueue<T>のような効率的なIEnumerable<T>コピーメカニズムを持つIProducerConsumerCollection<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)); 

これにより、アイテムをコレクションに1つずつ追加する(かなり重大な)ロックオーバーヘッドが回避されます。

関連する問題