F# 在F中无for循环迭代JArray#

F# 在F中无for循环迭代JArray#,f#,F#,我不想用这个for循环来迭代JArray。有没有其他方法可以代替for循环 let tablesInJson = jsonModel.["tables"] :?> JArray //Converting JOject into JArray for table in tablesInJson do let TableName = table.["name"] :?> JValue let columns = table.["columns"] :?&g

我不想用这个for循环来迭代JArray。有没有其他方法可以代替for循环

let tablesInJson = jsonModel.["tables"] :?> JArray  //Converting JOject into JArray

    for table in tablesInJson do 

    let TableName = table.["name"] :?> JValue
    let columns = table.["columns"] :?> JArray

    for col in columns do

        let name = col.["name"] :?> JValue
        let types = col.["type"] :?> JValue
        let length = col.["length"] :?> JValue

        let Result_ = sqlTableInfos 
                    |> List.tryFind (fun s -> s.TableName = TableName.ToString() && s.ColumnName = name.ToString()) 

        if Result_ = Unchecked.defaultof<_> then
            printfn "is null"
        else
            printfn "not null"
let tablesInJson=jsonModel。[“tables”]:?>JArray//将JOject转换为JArray
对于表INJSON do中的表
让TableName=table。[“name”]:?>JValue
let columns=表。[“columns”]:?>JArray
对于列中的列,请执行以下操作:
让name=col.[“name”]:?>JValue
让types=col.[“type”]:?>JValue
让length=col.[“length”]:?>JValue
让结果=sqlTableInfos
|>List.tryFind(fun s->s.TableName=TableName.ToString()&&s.ColumnName=name.ToString())
如果结果=未选中。则默认为
printfn“为空”
其他的
printfn“非空”

如果您想迭代集合并执行命令式操作,那么在F#中使用
for
循环是惯用的方法,您应该使用它。毕竟,
for
是一种F#语言结构!它的存在是有原因的,原因是它可以让您轻松地编写代码,在集合上进行迭代,并为每个元素执行某些操作

在某些情况下,
for
循环并不适合。例如,如果要将列集合转换为包含表信息的新集合。然后您可以使用
Seq.map

let tableInfos = columns |> Seq.map (fun col ->
    let name = col.["name"] :?> JValue
    let types = col.["type"] :?> JValue
    let length = col.["length"] :?> JValue
    let result = sqlTableInfos |> List.tryFind (fun s -> 
      s.TableName = TableName.ToString() && s.ColumnName = name.ToString()) 
    if result = Unchecked.defaultof<_> then None
    else Some result)
let tableInfos=columns>Seq.map(fun col->
让name=col.[“name”]:?>JValue
让types=col.[“type”]:?>JValue
让length=col.[“length”]:?>JValue
让result=sqlTableInfos |>List.tryFind(fun s->
s、 TableName=TableName.ToString()&&s.ColumnName=name.ToString()
如果result=Unchecked.defaultof,则无
还有一些结果)
这看起来像是你试图做的事情——但很难说。你的问题并没有说明你真正想要解决的问题是什么


您使用
printfn
的示例可能有误导性,因为如果您实际上只是想打印,那么
for
循环是最好的方法。

您可以使用
Seq
模块在
JArray
上执行序列处理操作。在您的情况下,我想我可能会对第二个for循环(在列上)执行此操作,但不会对外部循环执行此操作。原因是,如果将内部循环中的代码分解为函数,则可以使用管道和部分应用程序稍微清理代码:

open Newtonsoft.Json
open Newtonsoft.Json.Linq

type SqlTableInfo = {TableName: string; ColumnName: string}

let tablesInJson = JArray()
let sqlTableInfo = []

let tryFindColumn (tableName: JValue) (column: JToken) =
    let columnName = column.["name"] |> unbox<JValue>

    if sqlTableInfo |> List.exists (fun s -> s.TableName = tableName.ToString() && s.ColumnName = columnName.ToString())
    then printfn "Table %A, Column %A Found" tableName columnName 
    else printfn "Table %A, Column %A Found" tableName columnName 

for table in tablesInJson do 
    let tableName = table.["name"] |> unbox<JValue>
    table.["columns"] 
    |> unbox<JArray> 
    |> Seq.iter (tryFindColumn tableName)
打开Newtonsoft.Json
打开Newtonsoft.Json.Linq
键入SqlTableInfo={TableName:string;ColumnName:string}
设tablesInJson=JArray()
让sqlTableInfo=[]
let tryFindColumn(表名:JValue)(列:JToken)=
让columnName=column.[“name”]|>unbox
如果sqlTableInfo |>List.exists(fun s->s.TableName=TableName.ToString()&&s.ColumnName=ColumnName.ToString())
然后打印fn“找到表%A,列%A”表名columnName
else printfn“找到表%A,列%A”表名columnName
对于表INJSON do中的表
让tableName=table。[“name”]|>unbox
表[“列”]
|>拆开
|>序号iter(tryFindColumn表名)

为什么不想使用for循环?我正在尝试用F#方式@tomaspetricek将此
转换为tables中的表injson do let TableName=table。[“name”]:?>JValue let columns=table。[“columns”]:?>JArray
for loop out the table信息扫描请帮助我将问题中提到的两个for loop转换为?@AkashVishwakarma正如我在回答中提到的,您的问题没有完全解释您想要实现的目标。如果要打印消息,则
for
循环是最好的方法。如果您想对JSON中的信息执行其他操作(我希望是这种情况),那么您需要说明您正在尝试执行的操作。如果
结果为null,那么我想返回一个字符串,该字符串将具有值name类型和长度,如果它不是null,那么我想检查
!result.modelDataType.Equals(type)
此条件并返回相同的名称类型和长度