Newsgroup: it.comp.lang.visual-basic
Titolo: Eliminare un elemento da una Collection

Salve a tutti
ho due oggetto Collection Coll1 e Coll2
Dopo aver aggiunto gli elementi nell'insieme
coll1.Add vdati1
coll2.Add vdati2
dovrei mettere a confronto i valori ed eliminarli se sono uguali, es:
 For Each v1 In coll1
    For Each v2 In coll2
      If v1 = v2 Then
        coll1.Remove v1
        coll2.Remove v2
      End If
    Next v2
  Next v1
la risposta è "Indice non compreso nell'intervallo"
il metodo remove vuole un indice: oggetto.Remove indice
come ricavo l'indice ? o come posso cancellare dagli insiemi gli elementi
uguali in modo che rimangolo solo elementi con valori diversi ?
grazie
giuseppeD

   Next v1
E' tardi, ma ad occhio mi sa che ci sia un ciclo for each di troppo (ovvero
inutile).
Saluti
Massimo

come ricavo l'indice ? 
In queste situazioni io salvo nella collection degli oggetti che 
abbiano una proprieta' Key, il cui valore e' la chiave con cui
sono stati memorizzati nella collection, cosi' il codice diventa facilissimo:
col1.Remove myObject.Key
col2.Remove myObject.Key
ciao, hal

 la risposta è "Indice non compreso nell'intervallo"
perche mi pare che cosi gli chiedi di eliminare l'elemento di
indice v1 o v2, ma v1
potrebbe essere anche un valore single o un oggetto, quindi non
certo un indice(potresti pero usare un valore single come chiave
forse...)
prova
v1=0
do
  v2=0
  do
    if coll1(v1) = coll2(v2) then 
      coll1.remove v1:coll2.remove v2
    end if
      ' attenzione che potendo essere anche oggetti, per gli
elementi deel collezione va usato 	il giusto criterio di
confronto....
    v2=v2+1
  loop until v2> coll2.count-1
  v1=v1+1
loop until v1>coll1.count-1
bye

loop until v1>coll1.count-1
sara' l' orario, ma cio' mi perplime parecchio ....
ciao, hal

 [snip]
Grazie per le risposte ma penso sia meglio chiarire quello che vorrei
ottenere e posto l'intero codice; perchè nonostante i tentativi effettuati
non sono riuscito ad eliminare l'elemento:
Dim vdati1, vdati2, i As Integer
  Set rs = New ADODB.Recordset
  'prima collection
  rs.Open "SELECT OrderID FROM Orders;", conn, adOpenForwardOnly,
adLockReadOnly
  With rs
    i = 1
    .MoveFirst
    Do Until .EOF
      vdati1 = !orderid
      coll1.Add vdati1, CStr(i)
      .MoveNext
      i = i + 1
    Loop
    .Close
  End With
'  'seconda collection
  rs.Open "SELECT OrderID FROM OrdersDup;", conn, adOpenForwardOnly,
adLockReadOnly
  With rs
    i = 1
    .MoveFirst
    Do Until .EOF
      vdati2 = !orderid
      coll2.Add vdati2, CStr(i)
      .MoveNext
        i = i + 1
    Loop
    .Close
  End With
  Dim v1 As Variant, v2 As Variant
  For Each v1 In coll1
    For Each v2 In coll2
      If v1 = v2 Then
        coll1.Remove coll1.Item(v1.Key) '>>>>> Errore : Necessario oggetto
        coll2.Remove coll2.Item(v2.Key)
      End If
    Next v2
  Next v1
grazie
giuseppeD

  Next v1
Poiche' hai memorizzato gli id degli ordini, puoi fare il loop una volta sola,
usando piratescamente la gestione degli errori:
Dim v1 As Variant
On Local Error Resume Next
For Each v1 In coll1
       col2.Remove v1
       ' se l' elemento manca allora tira dritto
Next v1
If Err then Err.Clear
Oppure, se non ti piace generare errori il loop diventa:
Dim v1, v2
For Each v1 In col1
     For Each v2 In col2
          col1.Remove CStr(v1)
          col2.Remove CStr(v2)
          Exit For
     Next v2
Next v1
Non l' ho fatto girare e sono pure le due di notte.
Se non funziona, hai tutto il diritto di lamentarti :-)
ciao, hal

 
Il tuo problema č che rimuovi troppe volte l'oggetto v1.
Mi spiego tenedo fisso l'elemento v1 cicli su tutti gli elementi di v2
Ma se trovi v1=v2 li rimuovi tutti e due dalle rispettive collection, ma alla 
seconda ugualianza non puoi eleminare nuovamente v1 perchč lo hai gią tolto 
in un confronto precendente
-- 
Posted from  [217.57.33.234] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

         coll1.Remove coll1.Item(v1.Key) '>>>>> Errore : Necessario oggetto
La remove funziona sulla chiave!
Quindi
    coll1.Remove v1.Key ' ammesso di aver capito bene che v1.key č la tua
chiave
Ciao