For each e modifica array

domenica 31 maggio 2009 - 16.52

ds7f87dsf87 Profilo | Newbie

salve a tutti ho un array di nome users (shared)

questo array è in continuo mutamento tra eliminazione e aggiunta di user.

ho bisogno di inviare un messaggio a tutti e 5000 gli utenti ma mentre il ciclo invia i messaggi a tutti, entra un utente, modifica l'array (l'utente si è aggiunto all'array) e il ciclo va a all'aceto..... cosa posso fare? non mi dite usa una var boolean perche ho centinaia di cicli... ci sarà pur qualcosa che mi permette di sapere se l'array è sotto ciclo o no?

aiedail92 Profilo | Expert

Ciao

Potresti, al posto di usare un ciclo For Each, usare un semplice For, ed eventualmente racchiuderlo in un blocco Try, Catch, End Try; in questo modo anche se l'array viene modificato puoi continuare ad accedere agli elementi, e se eventualmente l'ultimo utente venisse rimosso mentre stai per accedere, l'eccezione verrebbe gestita dal Try e non bloccherebbe l'applicazione.

Luca

Jeremy Profilo | Guru

Oppure usare Linq!!

Supponiamo che tu abbia un array di 5000 elementi Dim Users(4999) As String Private Sub CiclaArray() Dim myUsers = From _Users In Users Select _Users For Each User In myUsers MessageBox.Show(User) Next End Sub

Facci sapere...
Ciao

aiedail92 Profilo | Expert

>Oppure usare Linq!!

Che però:

1) È disponibile solo da VB.Net 9 o C# 3.0 in poi
2) In questo caso sarebbe un grande spreco, basterebbe copiare l'array in un altro:

Dim users(4999) As Utente Dim copy As Utente() = CType(users.Clone(), Utente())

E comunque se dovesse essere aggiunto\rimosso un utente mentre cicli, non te ne avvedresti nel ciclo...

Luca

Jeremy Profilo | Guru

Ciao Luca
>1) È disponibile solo da VB.Net 9 o C# 3.0 in poi
Questo non è vero .... dipende dalla versione del Framework (3.5) non dall'ambiente di sviluppo.

>2) In questo caso sarebbe un grande spreco, basterebbe copiare l'array in un altro:
Perchè usare Linq lo definisci spreco?? E' una tecnica performante che comunque prima o poi va imparata, quindi perchè non utilizzarla all'occorrenza??

>E comunque se dovesse essere aggiunto\rimosso un utente mentre ....
Lo stesso succederebbe gestendo un'eccezione.

In allegato una piccola dimostrazione.

Ciao

aiedail92 Profilo | Expert

>>1) È disponibile solo da VB.Net 9 o C# 3.0 in poi
>Questo non è vero .... dipende dalla versione del Framework (3.5)
>non dall'ambiente di sviluppo.

Ma il framework 3.5 lo puoi usare da Visual Studio 2008, che generalmente offre VB.Net 9 e C# 3.0. In sostanza intendevo dire che serve un compilatore che supporti LINQ, e questo è fornito solo col Visual Studio 2008, che non tutti hanno...

>>2) In questo caso sarebbe un grande spreco, basterebbe copiare l'array in un altro:
>Perchè usare Linq lo definisci spreco?? E' una tecnica performante
>che comunque prima o poi va imparata, quindi perchè non utilizzarla
>all'occorrenza??

Lo definisco uno spreco perché sarebbe come usare una query SQL per eseguire operazioni aritmetiche: SELECT 2+2
Spero concorderai con me che una semplice copia dell'array sia abbastanza più performante...

>>E comunque se dovesse essere aggiunto\rimosso un utente mentre ....
>Lo stesso succederebbe gestendo un'eccezione.

Invece no, se un utente venisse aggiunto in fondo all'array mentre cicli, quando arrivi in fondo passerai anche sull'elemento aggiunto, e similmente se rimuovi un utente, quando arrivi in fondo all'array l'utente non è più presente e quindi non viene più considerato.

Comunque non volevo fare polemica, giustificavo solo la mia risposta iniziale

Luca

Jeremy Profilo | Guru

Ciao Luca.
>Comunque non volevo fare polemica, giustificavo solo la mia risposta
>iniziale
Neanche io, nessuna polemica, è solo uno scambio di idee differenti o quasi.

A parte il dubbio che mi rimane sul discorso .NET Framework 3.5 e VisualStudio 2005(dubbio che rimane in quanto non posso verificare), per tutto il resto, effettivamente, non posso dire null'altro in contraddizione.
E' solo che mi piace Linq e quindi dove posso lo uso.(forse anche quando effettivamente non è indispensabile)

Ciao.


Jeremy Profilo | Guru

Anzi, pensandoci bene .... il discorso Linq, è saltato fuori perchè, dsdfedfs(o come cavolo si chiama) ha fatto esplicito riferimento all'interfaccia IEnumerable.
http://www.pierotofy.it/pages/extras/forum/viewtopic.php?id=57139

Ciao

aiedail92 Profilo | Expert

Ah ma sei iscritto anche su pierotofy... Lo consultavo spesso qualche anno fa, quando ero ancora "giovane e inesperto"

Comunque bene, lasciamo a ds7f87dsf87 il tempo di rispondere

Luca

Jeremy Profilo | Guru

E si .. sono abbastanza malato di programmazione

AntCiar Profilo | Expert

Ciao.
Usa un ciclo For al contrario ossia partendo dall'ultimo elemento dell'array fino al primo. In questo modo quando l'array viene modificato potresti avere queste due situazioni:

-l'elemento inserito o eliminato si trova in una posizione già ciclata e qundi sarà valutato al prossimo giro.
-l'elemento inserito o eliminato si trova in una posizione ancora da ciclare e quindi verrà processato subito
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5