我有以下代码:
//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
的数组,是否必须列出它?
答案 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#具有一些功能来创建数组,所有数组都使用您只指定一次的相同构造函数进行初始化,但这是不可能的。