Aggregate 句でエラーになる

解決


犬好き  2012-12-29 04:18:02  No: 148039

配列だと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-29 07:23:57  No: 148040

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

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


犬好き  2012-12-29 11:22:51  No: 148041

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

>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 16:41:29  No: 148042

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 18:52:30  No: 148043

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


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加