Existe uma maneira de verificar se um IEnumerable está sendo acessado usando um loop For Each?

votos
1

Suponha que eu tenho um IEnumerable, como uma List (TValue) e eu quero manter informado se esta lista estiver sendo acessado (para evitar problemas com, digamos, a adicionar à lista enquanto ele está sendo iterada em um segmento diferente); Eu sempre pode escrever código como o seguinte:

Dim List1 As New List(Of Integer)
Dim IteratingList1 As Boolean = False

' ... some code ... '

Private Function getSumOfPositivesFromList1() As Integer
    If IteratingList1 Then Return -1

    IteratingList1 = True

    Dim SumOfPositives As Integer = 0

    For Each x As Integer In List1
        If x > 0 Then SumOfPositives += x
    Next

    IteratingList1 = False

    Return SumOfPositives
End Function

(Sei que este código é muito arbitrária, mas ilustra o que estou falando.)

A minha pergunta é se existe uma maneira melhor / mais limpo para realizar esta verificação do que por meio da atualização manualmente e acessar um booleano, como acima. Eu sinto que deve haver, mas, que eu saiba, não há qualquer classe IEnumerable com um método ou propriedade built-in Estou sendo iterado. E escrever uma nova classe que implementa IEnumerable e contém uma propriedade parece um exagero para mim.

Publicado 19/05/2009 em 14:30
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

Afaik, em VB.NET você pode usar a SyncLockcolocar um bloqueio em torno de um objeto enquanto acessá-lo, para evitar que outros tópicos de trabalhar simultaneamente sobre ele.

Public Shared objStorageLock As New Object

Private Function getSumOfPositivesFromList1() As Integer

    Dim SumOfPositives As Integer = 0

    SyncLock objStorageLock 

    For Each x As Integer In List1
        If x > 0 Then SumOfPositives += x
    Next

    End SyncLock

    Return SumOfPositives
End Function
Respondeu 19/05/2009 em 14:32
fonte usuário

votos
1

VB.net usará uma função GetEnumerator se um adequado existe, de preferência a utilização da interface IEnumerable. Pode-se, assim, implementar IEnumerable mas chamar dar o método de implementação IEnumerable.GetEnumerator algum outro nome. Como a maioria das outras rotinas que enumerar algo vai usar IEnumerable em vez de pato-digitando GetEnumerator, o fato de que o método GetEnumerator em si é chamado sugeriria que ele está sendo empregado por uma for-each loop.

Respondeu 01/02/2011 em 16:45
fonte usuário

votos
1

Depende do que você está fazendo, se você está preocupado com múltiplo acesso de escrita à lista Synclocké o caminho a percorrer.

Se você é depois de eliminar exceções durante a enumeração, em seguida, às vezes é melhor fazer obter uma cópia e enumerar que, como

For Each Num as Integer in SumOfPositives.ToArray()
...
Next Num

Obviamente, você pode querer considerar o uso de RAM e desempenho etc. etc., mas geralmente isso funciona bem e muito rápido.

Respondeu 19/05/2009 em 14:37
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more