FirstOrDefault是否会从BlockingCollection中删除该值

时间:2012-11-13 17:15:25

标签: .net vb.net linq task-parallel-library

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

阻止集合是UIDL logDetail对象是否会从阻塞集合中删除?

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

2 个答案:

答案 0 :(得分:3)

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

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

BlockingCollection.IEnumerable.GetEnumerator Method

答案 1 :(得分: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)