配列だとOKでコレクションだとエラーが出ます。
一行で平均などを求められるので便利と思いました。
どう書けば良いのでしょうか?。Vb2010。
エラー内容は↓
メソッド 'Average' の定義には、このコンテキストではアクセスできません。
この引数の数を受け付ける 'Average' がないため、オーバーロードの解決に失敗しました。
------
Private Sub hoge() Handles Button1.Click
Dim Test_Arr() As Double = {1.5, 2.3, 4.5, 2.3, 1.2}
Dim Test_Lst As New ArrayList
Test_Lst.Add(3.125)
Test_Lst.Add(1.9225)
Test_Lst.Add(4.855)
Test_Lst.Add(2.65)
Test_Lst.Add(4.25)
Dim av As Double
av = Aggregate s In Test_Arr Into Average()
av = Aggregate s In Test_Lst Into Average() '←エラーになる
MsgBox(av.ToString)
End Sub
ArrayList => List(Of Double)
に変更がてっとり早いです。
ArrayListはObject型のコレクションになるので
型が決まっているときは使用しないほうがよいです。
それでもArrayListという場合はCDblで要素をDoubleに変換すると
よいです。
さっそくのご回答ありがとうございました。
>ArrayList => List(Of Double)
↑これで解決いたしました。
>それでもArrayListという場合はCDblで要素をDoubleに変換すると
どうしてもArrayListをというわけではないのですが、CDblで要素を
Doubleに変換するというのはどのように書けば良いのでしょうか?。
的外れとは感じながらも
Aggregate s In CDbl(Test_Lst) Into Average() とか
Aggregate s In DirectCast(Test_Lst, Double) Into Average()
っとやってもエラーになります。ググってもお手本を見つけるこ
とができません。
御察しと思いますが、私はクラスとかコレクションとかオブジェクト
とかの知識がまだ断片的でして、「体でわかる」といった理解には
至っていません。まだまだ修行の身です。ご教授いただければ幸いです。
Dim Test_Lst As New ArrayList({3.125, 1.9225, 4.855, 2.65, 4.25})
Dim av = Aggregate s In Test_Lst Select CDbl(s) Into Average()
こんな感じです。SelectでCdblします。
あるいは
Dim av2 = Aggregate s In ary.Cast(Of Double)() Into Average()
Dim av3 = Aggregate s In ary.OfType(Of Double)() Into Average()
のようにCastやOfTypeで型変換をする方法もあります。Castは全要素に対し無条件で型変換するので変換エラーが出る場合がありますが、OfTypeは変換可能な要素のみ抽出するので型変換エラーが出ません。
具体的でたいへん解りやすい回答に感謝いたします。
とても勉強になりました。コピペの解決で済ますことなく
直感的にわかるよう「体で覚える」ことを目標に精進いたします。
ほんとにありがとうございました。