1

有没有办法返回 lambda 表达式中使用的对象,但具有不同的值?我一直在使用“一种 linq-select”的方式,但我想做这样的事情:

let bob= tab 
|> Seq.map (fun x -> ignore (x.Value=x.Value+1); x)
|> Seq.iter (fun x -> x.Dump())

使x我序列中的所有 's 的值 +1'ed。

而不是这样做:

let bob= tab 
|> Seq.map (fun x -> Ville(IdVille= 9, NoVille=x.Value+1, Nom=x.Nom, __RowVersion = x.__RowVersion))
|> Seq.iter (fun x -> x.Dump())

编辑:

我期望得到什么:从这里,序列的转储,因此 Iter 和 Dump ......我想要序列是什么?这是一个例子,原始序列,但是在对每个元素应用一个函数并获得结果的副本之后......(对原始序列没有副作用)。

例如,我有一个名字序列,我想要一个原始序列的副本,但名字是大写的。现在想象一下,但是从数据库中获取一系列对象。

编辑2:

我用 LinqPad 和 AdventureWorks 数据库做了一个测试,我这样做了:

let dc = new TypedDataContext()

let tab = dc.GetTable<Address>()

let bob = tab 
        |> Seq.map (fun x -> ignore (x.AddressLine1 <- "Bob"); x) 

tab.Dump()
bob.Dump()

2 Dump() 结果是不同的。如果我反转 2 Dump() 调用,则两个结果都是相同的。你是对的!

4

2 回答 2

3

很难说出你想要做什么,但是改变一个值表明了一种命令式的方法,那么为什么不使用for循环呢?

for x in tab do
  x.Value <- x.Value + 1
  x.Dump()

你期望什么价值bobSeq.iter返回unit。如果您在其中发生变异tabSeq.map它将具有与bob.

编辑

如果您在map结果中修改序列的元素,原始序列将是一个且相同的。map不打算与副作用一起使用。一个例子:

type T(value) =
  member val Value = value with get, set

let tab = [T(0); T(1); T(3)]
let bob = tab |> Seq.map (fun x -> x.Value <- x.Value + 1; x)
tab = (Seq.toList bob) //true
于 2012-08-30T19:57:35.677 回答
1

您可以尝试map与对象表达式一起使用来仅更新一个字段:

let bob = tab 
|> Seq.map (fun x -> {x with Value = x.Value + 1})
|> Seq.iter (fun x -> x.Dump())

虽然bob如果Dump()您使用iter. 你需要map再次使用它。

编辑

这仅适用于记录类型。

于 2012-08-30T20:19:34.910 回答