有没有办法返回lambda表达式中使用的对象,但是具有不同的值?我一直在使用“那种linq-select”方式,但我想做这样的事情:
let bob= tab
|> Seq.map (fun x -> ignore (x.Value=x.Value+1); x)
|> Seq.iter (fun x -> x.Dump())
使我的序列中的所有x
的值都为+ 1'。
而不是这样做:
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 ...... 我想要的序列是什么?这是一个例子,原始序列,但是在将函数应用于每个元素并获得结果的副本之后......(对原始序列没有副作用)。
例如,我有一系列名称,我想要原始序列的副本,但是有大写的名字。现在想象一下,但是从数据库中得到一系列对象。
EDIT2:
我使用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()调用,两个结果都是相同的。你是对的!
答案 0 :(得分:3)
很难说出你想要做什么,但是改变一个值表明了一种必要的方法,为什么不进行for
循环?
for x in tab do
x.Value <- x.Value + 1
x.Dump()
您对bob
的期望值是多少? Seq.iter
返回unit
。如果您在tab
内改变Seq.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
答案 1 :(得分: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
。
修改强>
这仅适用于record types.