返回具有不同值的对象

时间:2012-08-30 19:50:11

标签: map f# sequence linqpad

有没有办法返回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()调用,两个结果都是相同的。你是对的!

2 个答案:

答案 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())

如果使用bobDump()将无法获得iter分配给它的结果。您需要再次使用map

修改

这仅适用于record types.