0
    Dim logDetail = (
        From d In UIDLs
        Select d.EmailID
        Where EmailID = UIDL
    ).FirstOrDefault

阻塞集合是 UIDL。
logDetail 对象会从阻塞集合中取出吗?

这可能是对阻塞集合的无效使用,但 UIDL 就在那里,所以我可以并行查找 UIDL 中的值。我正在考虑使用并发字典,这对我来说似乎更糟,因为我基本上只有一个对象数组而不是名称值对。

4

2 回答 2

3

使用此查询将利用 IEnumerable 接口。

阻塞集合的默认 GetEnumerator 不会从列表中删除项目。

BlockingCollection.IEnumerable.GetEnumerator 方法

于 2012-11-13T17:57:37.857 回答
0

FirstOrDefault()不会从集合中删除任何项目。如果您使用GetConsumingEnumerable(),那么FirstOrDefault()将从集合中删除一个项目,以及它之前的所有项目,这不是您想要的。

您说您只有一个“字符串数组”,但您的代码说明了其他内容:您有一个对象集合,并且您希望根据该对象的某些属性在该集合中执行查找。如果是这种情况,ConcurrentDictionary应该很好地满足您的需求。有了它,您的代码将类似于:

' add item to the dictionary
Dim logDetails = New ConcurrentDictionary(Of String, LogDetail)
Dim d = …
logDetails.TryAdd(d.EmailID, d)

…

' try remove item from the dictionary
Dim emailID = …
Dim removed = logDetails.TryRemove(emailID, d)
于 2012-11-13T19:25:45.710 回答