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 に答える