4D v16 R6 opens a wide range of possibilities to manage collections. Merificare due collezioniin una, clonare o semplicemente ordinare una collezione è facile come chiamare un metodo. Si risparmia tempo prezioso, ad esempio, quando è necessario concatenare due collezioni, mantenere solo i valori distinti o ordinarli.
Questo articolo fa parte di una serie di dimostrazioni su come manipolare le collezioni utilizzando i metodi aggiunti in 4D v16 R6. Per saperne di più, scaricate il nostro esempio di database, che comprende 12 esempi diversi per mostrare cosa si può fare con i metodi delle collezioni!
Esempio di database: Gestire le raccolte
Copiare una collezione
Copia profonda
Il metodo copy restituisce una copia profonda dell’istanza della collezione. Una copia profonda significa che tutti gli elementi della collezione originale sono duplicati e non condividono alcun riferimento con la collezione restituita.
Nell’esempio seguente, l’esecuzione di una copia profonda con il metodo copy aggiunge un nuovo elemento a $col2 (a copy of the first collection – $col). An ulteriore elemento viene aggiunto a $col2, however $col remains unchanged:
//creare una collezione
$col:=Nuovacollezione("a"; "b"; "c"; "d"; "e")
//fare una copia profonda della prima collezione
$col2:=$col.copy($col)
//aggiunge un nuovo elemento alla copia del primo insieme
$col2.push("f")
// $col=["a", "b", "c", "d, "e"]
// $col2=["a", "b", "c", "d, "e", "f"]
Copia superficiale
Quando si esegue una copia superficiale di un insieme, gli elementi dell’insieme originale condividono i loro riferimenti con l’insieme restituito. Per esempio, se si crea una collezione, se ne fa una tipica copia superficiale e poi si aggiunge un nuovo elemento alla copia ($col2)), anche l’insieme originale ($col) rifletterà la modifica perché $col e $col2 condividono il loro riferimento:
//creare una collezione
$col:=Newcollection("a"; "b"; "c"; "d"; "e")
//fare una copia superficiale della prima collezione
$col2:=$col
//aggiungere un nuovo elemento alla copia della prima collezione
$col2.push("f")
// $col2=$col=["a", "b", "c", "d, "e", "f"]
È possibile creare una copia superficiale di una parte di un insieme utilizzando il metodo slice :
//create a collection
$col:=New collection("a"; "b"; "c"; "d"; "e")
// Copy from index 2 and stop at end of collection -1
$col2 :=$col.slice(2;-1)
//$col2=[c,d]
Combinazione di collezioni
La concatenazione di due raccolte può essere effettuata utilizzando il metodo concat o combine o il metodo
Il metodo concat restituisce un nuovo insieme con la concatenazione dei due insiemi:
//create 2 collections
$col:=Nuovacollezione("a"; "b"; "c")
$col2:=Nuovacollezione(1;2;3)
//combina le 2 collezioni in una terza collezione
$col3:=$col.concat($col2)
//$col3=["a", "b", "c",1,2,3]
Il metodo combine aggiunge ogni elemento di un insieme (passato come parametro) alla fine dell’insieme originale:
//create 2 collections
$col:=Nuovacollezione("a"; "b"; "c")
$col2:=Nuovacollezione(1;2;3)
//aggiunge la seconda collezione alla fine della prima
$col.combine($col2)
//$col=["a", "b", "c",1,2,3]
Il metodo distinct crea un nuovo insieme contenente solo valori distinti (diversi) dall’insieme originale:
$col:=New collection("a"; "b"; "c"; "a"; "b"; "c"; "d"; "e")
$col2 :=$col.distinct()
//$col2=[a,b,c,d,e]
Ordinamento di una collezione
Per ordinare un insieme, si possono usare i metodi sort o orderBy . Il metodo sort modifica l’insieme originale, mentre orderBy restituisce un insieme ordinato completamente nuovo (copia superficiale), ma non modifica l’insieme originale:
$col:=Nuovacollezione("a"; "b"; "c"; "a"; "b"; "c"; "d"; "e")
$col2:=$col.
orderBy()
//$col2=["a", "a", "b", "b", "c", "c", "d", "e"]
//$col=["a", "b", "c", "a", "b", "c", "d", "e"]
$col.sort()
//$col=["a", "a", "b", "b", "c", "c", "d", "e"]
È anche possibile ordinare un insieme usando sort o orderByMethodche richiede un metodo di richiamo:
$col:=Newcollection("Orange"; "Apple"; "Grape"; "Pear"; "Banana"; "Fig"; "Blackberry"; "Passion fruit")
$col2:=$col.orderByMethod("WordLength")
//$col2=[Frutto della passione,Mora,Arancia,Banana,Mela,Uva,Pera,Fico]
$col.sort("WordLength")
//$col=[Frutto della passione,Mora,Arancia,Banana,Mela,Uva,Pera,Fico]
Dove il metodo di callback WordLength è uno dei metodi del progetto:
$1.risultato:=Lunghezza(String($1.valore))>Lunghezza(String($1.valore2))
Infine, è possibile creare una copia profonda di un insieme con tutti i suoi elementi in ordine inverso, utilizzando il metodo reverse:
$col:=Nuovacollezione(1;3;5;2;4;6)
$col2:=$col.reverse()
//$c2=[6,4,2,5,3,1]