1

ラムダ式で使用されているが、値が異なるオブジェクトを返す方法はありますか? 私は「一種の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()

にどのような値を期待しbobますか? Seq.iter戻りますunittabその中でミューテーション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
于 2012-08-30T19:57:35.677 に答える
1

mapオブジェクト式と一緒に使用して、1 つのフィールドだけを更新することができます。

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

を使用している場合、割り当てられbobた結果は得られません。そのためには、もう一度使用する必要があります。Dump()itermap

編集

これは、レコード タイプでのみ機能します。

于 2012-08-30T20:19:34.910 に答える