我有一个处理DataTable的函数,用于查找具有特定值的列的任何行。它看起来像这样:
let exists =
let mutable e = false
for row in dt.Rows do
if row.["Status"] :?> bool = false
then e <- true
e
我想知道是否有办法在单个表达式中执行此操作。例如,Python具有“any”功能,可以这样做:
exists = any(row for row in dt.Rows if not row["Status"])
我可以在F#中为我的存在函数写一个类似的单行吗?
答案 0 :(得分:4)
您可以使用Seq.exists
函数,该函数接受谓词,如果谓词适用于序列的至少一个元素,则返回true。
let xs = [1;2;3]
let contains2 = xs |> Seq.exists (fun x -> x = 2)
但在您的具体情况下,它不会立即生效,因为DataTable.Rows
属于DataRowCollection
类型,它只实现IEnumerable
,而不是IEnumerable<T>
,并且因此它不会被视为F#意义上的“序列”,这意味着Seq.*
函数将无法使用它。要使它们起作用,您必须首先使用Seq.cast
let exists =
dt.Rows |>
Seq.cast<DataRow> |>
Seq.exists (fun r -> not (r.["Status"] :?> bool) )
答案 1 :(得分:0)
像这样(未经测试):
dt.Rows |> Seq.exists (fun row -> not (row.["Status"] :?> bool))
https://msdn.microsoft.com/visualfsharpdocs/conceptual/seq.exists%5b%27t%5d-function-%5bfsharp%5d