C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: クエリ式内での繰り返し変数使用


(過去ログ 133 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■78336 / inTopicNo.1)  クエリ式内での繰り返し変数使用
  
□投稿者/ ぜんざい部長 (1回)-(2016/01/08(Fri) 12:47:44)

分類:[VB.NET/VB2005 以降] 

VB2008を使用していますが、ListとLinqという便利なものがあることに最近気づき、
サルのように使っています。

ただし、以下のような使い方をすると、警告が表示されます。

(例1)
For Each obj As Class1 In lst1
    Dim q = From c In lst2 Where c.Hogehoge(obj)
    '(以下略)
Next

警告の内容:
 クエリ式内で繰り返し変数を使用すると、予期しない結果が発生する可能性があります。
 代わりに、ループ内にローカル変数を作成して繰り返し変数の値を割り当ててください。


ループ内にローカル変数を作成したり、あるいは以下のようにすれば上記警告は出ませんが、
何だかスッキリしません。

(例2)
For i As Integer = 0 To lst1.Count - 1
    Dim obj As Class1 = lst1.Item(i)
    Dim q = From c In lst2 Where c.Hogehoge(obj)
    '(以下略)
Next


また、仮に無視してもよい警告であったとしても、あまり気持ちのいいものではありません。
こういった場合、どのようなコードを書くのがよいのでしょうか?

引用返信 編集キー/
■78338 / inTopicNo.2)  Re[1]: クエリ式内での繰り返し変数使用
□投稿者/ 魔界の仮面弁士 (620回)-(2016/01/08(Fri) 14:53:02)
No78336 (ぜんざい部長 さん) に返信
> サルのように使っています。
今年の干支ですものね!(謎


> 何だかスッキリしません。
ラムダ式がいつ呼び出されるのかが問題になります。

Dim x(2) As Func(Of Integer)
For i = 0 To 2
  x(i) = Function() i
  Method1(x(i)())
Next
For i = 0 To 2
  Method2(x(i)())
Next


たとえば上記だと、Method1 には 0, 1, 2 が渡されますが、
Method2 には 3, 3, 3 が渡されるため、曖昧さが残ります。
ここで 3 が渡されることは予測しにくいわけで。



> こういった場合、どのようなコードを書くのがよいのでしょうか?

警告 42324 を nowarn 指定する手もありますが、それは避けたいところでしょうしね。
処理内容にもよりますが、たとえば

 For Each obj As Class1 In lst1
  Dim cache = obj
  Dim q = From c In lst2 Where c.Hogehoge(cache)
  '(略)
 Next

を使いたくないのだとすれば、

 lst1.ForEach(
  Sub(obj As Class1)
   Dim q = From c In lst2 Where c.Hogehoge(obj)
   '略
  End Sub
 )

のように処理するか、あるいはちょっと意味が変わってきますが、

 Dim q = From c1 In lst1 From c2 In lst2
     Where c2.Hogehoge(c1) Select c2
 For Each c In q
  '(略)
 Next

のようにしてみることで代用できるかもしれません。
引用返信 編集キー/
■78339 / inTopicNo.3)  Re[2]: クエリ式内での繰り返し変数使用
□投稿者/ ぜんざい部長 (2回)-(2016/01/08(Fri) 18:04:16)
魔界の仮面弁士 さん、書き込みありがとうございました。
ラムダ式というものも勉強を始めたところですが、奥が深いですね。

とりあえず、色々と試してみます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -