无法创建BlockingCollection数组

时间:2012-08-09 10:07:55

标签: c# blockingcollection

我有以下代码:

//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 个答案:

答案 0 :(得分:2)

_collectionOfQueues = new BlockingCollection<ConcurrentQueue<T>>[4];
for (int i = 0; i < 4; i++)
    _collectionOfQueue[i] = new ConcurrentQueue<T>();

答案 1 :(得分:2)

声明如下:

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

初始化如下:

_collectionOfQueues = new BlockingCollection<ConcurrentQueue<T>>[4];
for (int i = 0; i < 4; i++)
    _collectionOfQueue[i] = new ConcurrentQueue<T>();

答案 2 :(得分:1)

这与阻塞集合无关。 用于创建特定大小的数组并初始化其成员的语法无效。

尝试:

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

顺便说一句,您不必显式创建ConcurrentQueue<T>(仅使用默认构造函数),因为这是BlockingCollection<T>的默认后备集合。

答案 3 :(得分:1)

您希望创建BlockingCollection<T>个实例的四元素数组,并且希望使用接受ConcurrentQueue<T>实例的构造函数初始化每个实例。 (请注意,BlockingCollection<T>的默认构造函数将使用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#具有一些功能来创建数组,所有数组都使用您只指定一次的相同构造函数进行初始化,但这是不可能的。