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

■34387 / 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("="))

違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←LINQのメソッド構文の書き方 /VBはじめました →Re[2]: LINQのメソッド構文の書き方 /VBはじめました
 
上記関連ツリー

Nomalアイコン LINQのメソッド構文の書き方 / VBはじめました (19/11/13(Wed) 13:35) #34383
Nomalアイコン Re[1]: LINQのメソッド構文の書き方 / Hongliang (19/11/13(Wed) 13:59) #34384
Nomalアイコン LINQのメソッド構文の書き方 / 魔界の仮面弁士 (19/11/13(Wed) 15:33) #34387 ←Now
  └Nomalアイコン Re[2]: LINQのメソッド構文の書き方 / VBはじめました (19/11/14(Thu) 09:21) #34388 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -