F# 在F中无for循环迭代JArray#
我不想用这个for循环来迭代JArray。有没有其他方法可以代替for循环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
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)
此条件并返回相同的名称类型和长度