4D v16 R6 opens a wide range of possibilities to manage collections. MCravar duas colecçõesnuma só, clonar ou simplesmente encomendar uma colecção é tão fácil como chamar um método. Poupa tempo valioso, por exemplo, quando é necessário concatenar duas colecções, manter apenas os valores distintos, ou ordená-los.
Este artigo faz parte de uma série que demonstra como manipular as colecções utilizando os métodos adicionados em 4D v16 R6. Para saber ainda mais, descarregue o nosso exemplo de base de dados, que inclui 12 exemplos diferentes para mostrar o que se pode fazer com os métodos de recolha!
Exemplo de base de dados: Gerir colecções
Cópia de uma colecção
Cópia profunda
O copy devolve uma cópia profunda da instância de recolha. Uma cópia profunda significa que todos os elementos da colecção original são duplicados e não partilham qualquer referência com a colecção devolvida.
No exemplo abaixo, a realização de uma cópia profunda utilizando o copy acrescenta um novo elemento ao método $col2 (a copy of the first collection – $col). An elemento adicional é adicionado a $col2, however $col remains unchanged:
//criar uma colecção
$col:=Novacolecção("a"; "b"; "c"; "d"; "e")
// fazer uma cópia profunda da primeira colecção
$col2:=$col.copiar($col)
//adicionar um novo elemento à cópia da primeira colecção
$col2.push("f")
// $col=["a", "b", "c", "d, "e"]
//$col2=["a", "b", "c", "d, "e", "f"]
Cópia rasa
Quando se faz uma cópia superficial de uma colecção, os elementos da colecção original partilham as suas referências com a colecção devolvida. Por exemplo, se criar uma colecção, faça uma cópia rasa típica da mesma, e depois adicione um novo elemento à cópia ($col2)A colecção original ($col) também reflectirá a mudança porque $col e $col2 partilham a sua referência:
//criar uma colecção
$col:=Novacolecção("a"; "b"; "c"; "d"; "e")
// fazer uma cópia superficial da primeira colecção
$col2:=$col
//adicionar um novo elemento à cópia da primeira colecção
$col2.push("f")
// $col2=$col=["a", "b", "c", "d, "e", "f"]
Pode criar uma cópia superficial de uma parte de uma colecção utilizando o slice método:
//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]
Combinação de colecções
A concentração de duas colecções pode ser feita utilizando qualquer um dos métodos concat ou combine métodos.
O concat devolve uma nova colecção com a concatenação das duas colecções:
//create 2 collections
$col:=Novacolecção("a"; "b"; "c")
$col2:=Novacolecção(1;2;3)
//combine as 2 colecções numa 3ª colecção
$col3:=$col.concat($col2)
//$col3=["a", "b", "c",1,2,3]
O combine adiciona cada elemento de uma colecção (passado no parâmetro) ao final da colecção original:
//create 2 collections
$col:=Novacolecção("a"; "b"; "c")
$col2:=Novacolecção(1;2;3)
//add a 2ª colecção até ao final da primeira colecção
$col.combine($col2)
//$col=["a", "b", "c",1,2,3]
O distinct cria uma nova colecção contendo apenas valores distintos (diferentes) da colecção original:
$col:=New collection("a"; "b"; "c"; "a"; "b"; "c"; "d"; "e")
$col2 :=$col.distinct()
//$col2=[a,b,c,d,e]
Classificar uma colecção
Para ordenar uma colecção, pode utilizar o sort ou orderBy métodos. O sort modifica a colecção original, enquanto que orderBy devolve uma colecção inteiramente nova (cópia rasa), ordenada, mas não modifica a colecção original:
$col:=Novacolecção("a"; "b"; "c"; "a"; "b"; "c"; "d"; "e")
$col2:=$col.encomendarPor()
//$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"]
Também se pode ordenar uma colecção usando sort ou orderByMethodque requer um método de call back:
$col:=Novacolecção("Laranja"; "Maçã"; "Uva"; "Pêra"; "Banana"; "Figo"; "Amora"; "Maracujá")
$col2:=$col.orderByMethod("WordLength")
//$col2=[Maracujá,Amora,Laranja,Banana,Maçã,Uva,Pêra,Figo]
$col.sort("WordLength")
//$col=[Maracujá,Amora,Laranja,Banana,Maçã,Uva,Pêra,Figo]
Onde o método WordLength callback é um dos seus métodos de projecto:
$1.resultado:=Length(String($1.valor))>Length(String($1.valor2))
Finalmente, pode fazer uma cópia profunda de uma colecção com todos os seus elementos em ordem inversa, utilizando reverse:
$col:=Novacolecção(1;3;5;2;4;6)
$col2:=$col.reverse()
//$c2=[6,4,2,5,3,1]