我有 2 个 obj[] 列表 list1 和 list2。List1的长度为8,list2的长度为10。list1中存在只存在于list1中的数组。list2 也是如此。但两者都存在数组。我想知道如何获取 list1 中存在的数组。当我运行代码时,我得到了两个列表中都存在的数组的列表,但它缺少 list1 特有的数据。我想知道如何获取唯一的 list1 数据。有什么建议么?
let getProdOnly (index:int)(list1:obj[]list)(list2:obj[]list) =
let mutable list3 = list.Empty
for i = 0 to list1.Length-1 do
for j = 0 to list2.Length-1 do
if list1.Item(i).GetValue(index).Equals(list2.Item(j).GetValue(index)) then
System.Diagnostics.Debug.WriteLine("Exists in List 1 and 2")
else
list3 <- list1.Item(i)
Run Code Online (Sandbox Code Playgroud)
像这样的东西:
let ar1 = [|1;2;3|]
let ar2 = [|2;3;4|]
let s1 = ar1 |> Set.ofArray
let s2 = ar2 |> Set.ofArray
Set.difference s1 s2
//val it : Set<int> = set [1]
Run Code Online (Sandbox Code Playgroud)
Array如果您想直接使用数组,还有许多相关函数,例如compareWith、distinct。
但正如之前的答案中所指出的,这种类型的命令式代码并不是很惯用。尽量避免可变变量,尽量避免循环。Array.map例如,它可能可以重写。
如果您想要一个列表中唯一的元素,这是在 F# 4.0 中实现此目的的最简单方法:
list1
|> List.except list2
Run Code Online (Sandbox Code Playgroud)
这将从 list1 中删除 list2 的所有元素。请注意,它except也调用不同的,因此您可能需要注意这一点。