Collection et insertion unique

Bonjour,
je me demande si j’ai loupé une fonction des collections, car je cherche le moyen d’insérer de façon unique une valeur dans une collection. Mais part faire le code suivant je ne trouve pas de méthode plus courte.

<code 4D>
if ($collection.indexOf(1) < 0)
$collection.push(1)
end if
</code 4D>

D’avance merci

Salut Loïc,
pas mieux avec les collections de scalaires, je suis preneur s’il y a plus sioux. Si c’est un problème de perf sur un gros traitement, il est possible que transiter par un tableau soit plus efficace :
collection vers tableau
trier tableau
si(chercher dans tableau trié je te trouve pas)
ajouter au tableau
fin de si
tableau vers collection

Je ne sais pas si c’est plus performant mais j’aurais fait ainsi :

<code 4D>
$collection.push(1)
$collection:=$collection.distinct()
</code 4D>

Ha oui, ça c’est sioux…
Tu proposes bien distinct une seule fois, après tous les push ?

I couldn’t resist testing this using the following code:

<code 4D>
C_LONGINT($ms)
$ms:=Milliseconds

$temp_c:=New collection
For ($i;1;1000)
$n:=rand_rng_int (1;10)

      // $temp_c:=$temp_c.push($n)  // #1
  // $temp_c:=$temp_c.push($n).distinct()  // #2

If ($temp_c.indexOf($n)<0)  // #3
	$temp_c.push($n)
End if 

End for

$ms:=Milliseconds-$ms
ALERT(“This run: “+String($ms)+” ms”)
</code 4D>

For Code :
rand_rng_int
use your own random range method.

#1 case I simply pushed $n to get a base line.
#2 case is Vincent’s approach
#3 case is the if statement

My results were:
push only: 12-16 ms
push & distinct: 24-30 ms
if indexOf: 14-16 ms

This is v18.1, interpreted on a 2016 MBP.

First thought is these differences may disappear when compiled.
Second is the one-liner is technically slower by a few milliseconds - when I do it 1000 times.

My conclusion: the one liner is the way to go. The difference in run time is inconsequential in all but the most extreme circumstances.

18R2 on macbook pro

INTERPRETED
My results were:
push only: 4 ms
push & distinct: 120 ms
if indexOf: 12 ms

COMPILED
My results were:
push only: 1 ms
push & distinct: 125 ms
if indexOf: 8 ms

18.1 on macbook pro

INTERPRETED
My results were:
push only: 4 ms
push & distinct: 138 ms
if indexOf: 12 ms

I thought Vincent meant this:

for(many times)
push
end for
distinct // once after the loop.

I’m not found of writing a lot in the same line…

: Arnaud DE MONTARD

I thought Vincent meant this:

In this case duration is compiled 1ms interpreted 4ms