2

次のコードがあります。

//In a Class:
private BlockingCollection<T>[] _collectionOfQueues;
// In the Constructor:
_collectionOfQueues = new BlockingCollection<T>(new ConcurrentQueue<T>())[4];

一番下の行に次のエラーが表示されます。

タイプ 'System.Collection.Concurrent.BlockingCollection' の式に [] を使用したインデックス作成を適用することはできません

私がしても:

_collectionOfQueues = new BlockingCollection<T>(new ConcurrentQueue<T>())[];

最後の角括弧でエラーが発生します。

構文エラー; 期待値

BlockingCollection私ができるように、のコレクションでの配列を作成しようとしてConcurrentQueueいます:

_collectionOfQueues[1].Add(...);
// Add an item to the second queue

私は何を間違っていますか?それを修正するにはどうすればよいですか? の配列を作成できないBlockingCollectionので、リストを作成する必要がありますか?

4

4 に答える 4

2
_collectionOfQueues = new BlockingCollection<ConcurrentQueue<T>>[4];
for (int i = 0; i < 4; i++)
    _collectionOfQueue[i] = new ConcurrentQueue<T>();
于 2012-08-09T10:10:06.070 に答える
2

次のように宣言します。

private BlockingCollection<ConcurrentQueue<T>>[] _collectionOfQueues;

次のように初期化します。

_collectionOfQueues = new BlockingCollection<ConcurrentQueue<T>>[4];
for (int i = 0; i < 4; i++)
    _collectionOfQueue[i] = new ConcurrentQueue<T>();
于 2012-08-09T10:11:14.447 に答える
1

インスタンスの 4 つの要素の配列を作成し、BlockingCollection<T>インスタンスを受け入れるコンストラクターで各インスタンスを初期化する必要がありConcurrentQueue<T>ます。(デフォルトのコンストラクターはバッキングコレクションとしてBlockingCollection<T>a を使用するConcurrentQueue<T>ため、代わりにデフォルトのコンストラクターを使用して逃げることができますが、デモの目的で、質問からの構築に固執します。)

コレクション初期化子を使用してこれを行うことができます。

BlockingCollection<T>[] _collectionOfQueues = new[] {
  new BlockingCollection<T>(new ConcurrentQueue<T>()),
  new BlockingCollection<T>(new ConcurrentQueue<T>()),
  new BlockingCollection<T>(new ConcurrentQueue<T>()),
  new BlockingCollection<T>(new ConcurrentQueue<T>())
};

または、ある種のループを使用して実行できます。LINQ を使用するのがおそらく最も簡単な方法です。

BlockingCollection<T>[] _collectionOfQueues = Enumerable.Range(0, 4)
  .Select(_ => new BlockingCollection<T>(new ConcurrentQueue<T>()))
  .ToArray();

何らかの方法で、配列内の各要素を初期化するコードを提供する必要があることに注意してください。あなたの問題は、一度だけ指定した同じコンストラクターを使用してすべて初期化された要素を持つ配列を作成する機能が C# に期待されているようですが、それは不可能です。

于 2012-08-09T10:15:17.397 に答える
1

これは、ブロッキング コレクションとは関係ありません。特定のサイズの配列を作成し、そのメンバーを初期化するために使用している構文が無効です。

試す:

_collectionOfQueues = Enumerable.Range(0, 4)
                                .Select(index => new BlockingCollection<T>())
                                .ToArray();

ちなみに、そのConcurrentQueue<T>ような を明示的に作成する必要はありません (デフォルトのコンストラクターを使用するだけです)。これは のデフォルトのバッキング コレクションですBlockingCollection<T>

于 2012-08-09T10:10:27.663 に答える