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