2015-06-04 15 views
5

Ben f # için oldukça yeni ve ben bir listeden farklı değerlerin bir listesini çıkarmak için çalışırken zor anlar yaşıyorum: Bunu nasılListeden farklı öğeleri nasıl ayıklarsınız?

let myList = [ 1; 2; 2; 3; 4; 3 ] 
// desired list 
[ 1; 2; 3; 4 ] 

? seq'un distinct yöntemine sahip olduğunu, ancak listelemenin olmadığını gördüm.

cevap

13
let myList = [ 1; 2; 2; 3; 4; 3 ] 
let distinctList = myList |> Seq.distinct |> List.ofSeq 

Sonuç:

> 
val myList : int list = [1; 2; 2; 3; 4; 3] 
val distinctList : int list = [1; 2; 3; 4] 

Sonraki F # sürümü (4.0) sahip olacak List.distinct fonksiyon

+0

Bu kod ile biraz kafam karıştı (harika çalışıyor). Yani bir listeyi Seq.distinct'e aktarabilirsin? ... hayır bekle ... bu çünkü liste (ne olursa olsun fonksiyonel terim) seq uygular? –

+1

F # dizileri, "IEnumerable" için bir diğer ad olan "seq <'T>" türüyle temsil edilir. List, IEnumerable'ı uygular, böylece tüm 'Seq' modül fonksiyonlarını çağırırsınız. Ancak bir sonuç olarak Listeye ihtiyacınız varsa, 'list.ofSeq' işlevini kullanarak' seq 'sonucunu döndürmeniz gerekir. – Petr

+0

Tamam, bu mantıklı. Teşekkürler! –

3

emin değil eğer kötü veya Petr answer daha iyi ama aynı zamanda yapabilirdi:

let distinct xs = xs |> Set.ofList |> Set.toList 

> distinct [ 1; 2; 2; 3; 4; 3 ];; 
val it : int list = [1; 2; 3; 4] 
+0

Yeniden kullanılabilir işlev için teşekkürler! F # havalı. : D –

İlgili konular