Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包含ConcurrentQueue C#_C# - Fatal编程技术网

包含ConcurrentQueue C#

包含ConcurrentQueue C#,c#,C#,我正在用并行操作中的CSV记录填充ConcurrentQueue(我使用的是最佳收集选项吗?) ConcurrentQueue bag=new ConcurrentQueue(); “这是123,他们抛出了一个异常,错误5678” 我在此集合上未看到“Contains”方法。我怎样才能在收藏中看到witch项目有“thisIsID123”?你不能轻易做到这一点。对队列所能做的就是排队、出列或枚举。要在队列中查找元素,您需要通过完整的迭代对其进行强制搜索 foreach(var element

我正在用并行操作中的CSV记录填充ConcurrentQueue(我使用的是最佳收集选项吗?)

ConcurrentQueue bag=new ConcurrentQueue();
“这是123,他们抛出了一个异常,错误5678”

我在此集合上未看到“Contains”方法。我怎样才能在收藏中看到witch项目有“thisIsID123”?

你不能轻易做到这一点。对队列所能做的就是排队、出列或枚举。要在队列中查找元素,您需要通过完整的迭代对其进行强制搜索

foreach(var element in myQueue)
{
    //...
}
…还是和林克一起

也许一个更合适的容器可以帮上忙?C5系列提供一个可在FIFO模式下运行的控制器。它提供了最好的链表(例如队列)和哈希表来快速访问队列中间的元素。它不是为并发使用而设计的,因此您必须使用锁同步读写操作。快一点,你就可以拿到它了

在不太了解您的问题域的情况下,我认为将每个条目放入
ConcurrentBag
ConcurrentQueue
(为什么?因为它是插入最有效的并发集合,对预期用途的假设很少)(请参阅每个并发集合的优点)并且在数据采集完成后处理收集的内容可能更可取。您当然不需要队列提供的顺序,因为并行循环中的处理顺序无论如何都是不确定的,因此实际上您将以半随机顺序将元素放入集合中

因此,作为对您评论的回应,您可以将所有内容收集在一个袋子中:

var bag=new ConcurrentBag<Tuple<int, string>>();
var random=new Random();
//lets create some tuples to put in our bag
var objects = Enumerable
                  .Range(0, 1000000)
                  .Select(n= > Tuple.Create(n, n.ToString()))
                  .OrderBy(_ => random.Next())
                  .ToList();
Parallel.ForEach(objects, obj=>
{
    bag.Add(obj);
});
现在,您可以非常快速地查找集合中哪些元组具有特定的
Item1

IEnumerable<Tuple<int,string>> itemsOfInterest = lookup[3];
然后


您看不到
包含
,因为它与队列一起使用没有任何意义。也许您想要一个
哈希集
?您将对这些字符串执行什么操作?ConcurrentQueue实现IEnumerable,那么Contains LINQ扩展方法呢?@Yuval我想从并行操作填充一个集合。这样做很好。有更好的选择吗?@Daniel我不是专家,你能给我看一个样本吗?@DanielKelley只要
包含
返回true,就不能保证该项目会存在于队列中(它可能已被删除)。我们不能指望Linq方法进行并发收集。我了解到ConcurrentBag在@nlstack01队列上存在性能问题,post正在衡量创建许多
ConcurrentBag
实例的成本(这个问题似乎在.Net的更高版本中得到了解决)。我建议您使用一个ConcurrentBag来放置元素。一个完全不同的命题。你介意在Paralell.ForEach中显示一个填充包的示例,然后在填充包之后,根据上面的id获得一个元素吗?
var lookup = bag.ToLookup(x=>x.Item1);
IEnumerable<Tuple<int,string>> itemsOfInterest = lookup[3];
var dic= bag.ToDictionary(x=>x.Item1);
var item = dic[3];