DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■34383 / inTopicNo.1)  LINQのメソッド構文の書き方
  
□投稿者/ VBはじめました 一般人(20回)-(2019/11/13(Wed) 13:35:31)
  • アイコン環境/言語:[VisualStudil VB.net] 
    分類:[.NET] 

    LINQのクエリ構文をメソッド構文に書き換えている時にわからなくなりました。
    詳しい方教えてください。
    (質問1)
    コメントの@-1をメソッド構文に変換すると、@-2ポクなると思いますが、
    エラーがでます。
    
    (質問2)
    コメントのA-1をメソッド構文に変換すると、A-2ポクなると思いますが、
    エラーがでます。
    
      Sub Test1()
            Dim animals = New String() {"イヌ", "ヒツジ", "ウマ", "シロナガスクジラ", "コウモリ"}
            Dim results = From name In animals Select AnimalName = name, NameLength = name.Length '@-1
            '結果セットを取得して表示
            For Each animal In results
                ListBox1.Items.Add(animal.AnimalName)
                ListBox1.Items.Add(animal.NameLength)
            Next
            Dim results1 = animals.Select(Function(animal) AnimalName = Name, NameLength = Name.Length) '@-2
            ' この引数の数を受け付ける '[Select]' がないため、オーバーロードの解決に失敗しました。
            'NameLength' は宣言されていません。アクセスできない保護レベルになっています。
        End Sub
        Sub Test2()
            Dim fileName = New StackFrame(True).GetFileName
            Dim lines = IO.File.ReadAllLines(fileName)
            Dim query = From line In lines
                        Select trimed = line.Trim
                        Where trimed.StartsWith("Dim ") AndAlso trimed.Contains("=") 'A-1
            ListBox1.Items.AddRange(query.ToArray)
            Dim query1 = lines.
                           Select(Function(line) trimed = line.Trim).
                                   Where(Function(line) trimed.StartsWith("Dim ") AndAlso trimed.Contains("=")) 'A-2
            'trimed' は宣言されていません。アクセスできない保護レベルになっています。
    
        End Sub
    
    宜しくお願いいたします。

マルチポストを報告
違反を報告
引用返信 削除キー/
■34384 / inTopicNo.2)  Re[1]: LINQのメソッド構文の書き方
□投稿者/ Hongliang 大御所(571回)-(2019/11/13(Wed) 13:59:26)
  • アイコンクエリ構文内のSelectの記述は、通常のVB文法における匿名型となります。
    VB 匿名型
    などでまず検索してみてください。
違反を報告
引用返信 削除キー/
■34387 / inTopicNo.3)  Re[1]: LINQのメソッド構文の書き方
□投稿者/ 魔界の仮面弁士 大御所(1258回)-(2019/11/13(Wed) 15:33:51)
  • アイコン
    No34383に返信(VBはじめましたさんの記事)
    > (質問1)
    > Dim results = From name In animals Select AnimalName = name, NameLength = name.Length '@-1
    
    クエリ構文 の Select 句にはメンバーが複数あるため、
    上記の results は、それらのメンバーを束ねた匿名型を列挙した
    「IEnumerable(Of 匿名型)」として扱われます。
    
    
    > Dim results1 = animals.Select(Function(animal) AnimalName = Name, NameLength = Name.Length) '@-2
    
    匿名型の宣言には New With { 〜 } を使います。
    ラムダ式の引数名は任意ですが、先のクエリ構文に合わせる場合、
    引数名は animal ではなく name となるでしょう。
    
    Dim results1 = animals.Select(Function(name) New With { Key .AnimalName = name, Key .NameLength = name.Length })
    
    
    このとき、匿名型のメンバーの前にある Key を外して宣言することもできます。
    
    Dim results2 = animals.Select(Function(animal) New With { Key .AnimalName = Name, .NameLength = Name.Length })
    Dim results3 = animals.Select(Function(animal) New With { .AnimalName = Name, .NameLength = Name.Length })
    
    
    results1〜3 の結果はほぼ同じように見えますが、意味は少し変わります。
    匿名型において、Key の無いメンバーは読み書き可能なプロパティとなるのに対し、
    Key をつけた項目は読み取り専用となるためです。
    
    Key メンバーは、2 つの匿名型インスタンスを Equals メソッドで比較する際に、
    両者のインスタンスが等しいかどうかを検査するための項目としても使われます。
    
    
    
    > (質問2)
    > Dim query = From line In lines
    >             Select trimed = line.Trim
    >             Where trimed.StartsWith("Dim ") AndAlso trimed.Contains("=") 'A-1
    
    質問1とは異なり、クエリ構文 の Select 句にメンバーが一つしか無いため、
    変数 query の型は「IEnumerable(Of 匿名型)」になりません。上記の query は、
    trimed の型である String を列挙するための「IEnumerable(Of String)」となります。
    
    
    
    > Dim query1 = lines.
    >                Select(Function(line) trimed = line.Trim).
    >                        Where(Function(line) trimed.StartsWith("Dim ") AndAlso trimed.Contains("=")) 'A-2
    
    質問1を真似て、匿名型で表現した場合は
       Dim query0 = lines.Select(Function(line) New With {Key .trimed = line.Trim()}) _
                         .Where(Function(o) o.trimed.StartsWith("Dim ") AndAlso o.trimed.Contains("="))
    と書けるのですが、これだと結果が「IEnumerable(Of 匿名型)」になってしまいます。
    
    今回は「IEnumerable(Of String)」で返す必要がありますので、ラムダ式は匿名型ではなく
    String を戻り値とするように記述します。
    
      Dim query1 = lines.Select(Function(line) line.Trim()) _
                        .Where(Function(trimed) trimed.StartsWith("Dim ") AndAlso trimed.Contains("="))

違反を報告
引用返信 削除キー/
■34388 / inTopicNo.4)  Re[2]: LINQのメソッド構文の書き方
□投稿者/ VBはじめました 一般人(21回)-(2019/11/14(Thu) 09:21:39)
  • アイコン魔界の仮面弁士さん

    いつも有難う御座います。
    New With {}については、前回教えて頂いたので、何度も書き込んでみたのですが、
    うまく来ませんでした。
    再び、魔界さんのコードを見て"."が抜けていたのに気づきました。
    しかし、本質が理解てきていないので、エラー文から解決に至ることができず、
    また、お手を煩わせることになりすみません。

    また、理解できていない部分が明確になり大変たすかりました。

    色々、ググってから質問しておりますが、ググればググるほど、知らない単語が出てきます。また、一つの単語を理解するだけでは、問題が解決せず、複雑に関連しておりなかなか理解が進みません。
    デリゲート、ラムダ式、式ツリー、インターフェース、匿名、型推測、クエリ構文、メソッド構文挙げれば切がありません。
    これからも、頑張って研鑽して行こうと考えています。
    また、行き詰ったときは、教えてください。
    いつも、有難う御座います。
解決み!
違反を報告
引用返信 削除キー/



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

このトピックに書きこむ

Mode/  Pass/


- Child Tree -