F#在元组列表中查找不同的元素

时间:2017-12-15 15:03:14

标签: f#

我有一个元组列表:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then AutoDropdown 'if a value is changed on Column 3/ Column C then call the name of the above subroutine, in this case it is called AutoDropdown
End Sub

我想在一些条件下创建一个返回bool的函数:两个int都必须大于0,列表中的字符串必须是不同的。

到目前为止,我有:

(string * (int * int)) list
let st = [("a1",(100,10)); ("a2",(50,20)); ("a3",(25,40))]

但是我无法弄清楚如何找出列表中的所有字符串是否都是不同的。任何提示?

2 个答案:

答案 0 :(得分:6)

使用distinctBy

let inv st =        
    List.length (List.distinctBy fst st) = List.length st && List.forall (fun (a,(n,p)) -> n>0 && p>0) st

或者您可以在一个管道中组合两个检查:

let inv st =        
    st
    |> List.filter (fun (_,(n,p)) -> n>0 && p>0)
    |> List.distinctBy fst
    |> List.length
    |> (=) (List.length st)

答案 1 :(得分:1)

最简单的方法是编译所有不同字符串的列表(通过List.distinct),看看它是否与原始列表的大小相同:

let allDistinctStirngs = st |> List.map fst |> List.distinct
let allStringsAreDistinct = List.length st = List.length allDistinctStrings