Aggregate 句でエラーになる

解決


犬好き  2012-12-28 19:18:02  No: 148039  IP: [192.*.*.*]

配列だと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

編集 削除
shu  2012-12-28 22:23:57  No: 148040  IP: [192.*.*.*]

ArrayList => List(Of Double)
に変更がてっとり早いです。

ArrayListはObject型のコレクションになるので
型が決まっているときは使用しないほうがよいです。
それでもArrayListという場合はCDblで要素をDoubleに変換すると
よいです。

編集 削除
犬好き  2012-12-29 02:22:51  No: 148041  IP: [192.*.*.*]

さっそくのご回答ありがとうございました。

>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()
っとやってもエラーになります。ググってもお手本を見つけるこ
とができません。

御察しと思いますが、私はクラスとかコレクションとかオブジェクト
とかの知識がまだ断片的でして、「体でわかる」といった理解には
至っていません。まだまだ修行の身です。ご教授いただければ幸いです。

編集 削除
shu  2012-12-29 07:41:29  No: 148042  IP: [192.*.*.*]

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は変換可能な要素のみ抽出するので型変換エラーが出ません。

編集 削除
犬好き  2012-12-29 09:52:30  No: 148043  IP: [192.*.*.*]

具体的でたいへん解りやすい回答に感謝いたします。
とても勉強になりました。コピペの解決で済ますことなく
直感的にわかるよう「体で覚える」ことを目標に精進いたします。
ほんとにありがとうございました。

編集 削除