19

この VB Linq クエリの次の 2 つのバージョンの結果の違いは何ですか?

' 別の場所で定義された従業員の詳細を含む XElement があるとします

Dim ee = From e In someXML.<Employee> _
Select New With {.Surname = e.<Surname>, .Forename = e.<Forename>}

Dim ee = From e In someXML.<Employee> _
Select Surname = .Surname = e.<Surname>, .Forename = e.<Forename>

つまり、New ... With 構文のポイントは何ですか?

これには簡単な答えがあると思いますが、見つけることができません-適切なチュートリアルまたはマイクロソフトのドキュメントへのリンクをいただければ幸いです。

4

6 に答える 6

3

私の理解では、違いはありません。

New Withのようなクエリ外での使用を目的としています

Dim X = New With { .Surname = "A", .Forename = "B" }

特に Linq クエリの場合はスキップできますがNew With、他の状況では引き続き役立ちます。ただし、VB 9を知らないので、よくわかりません:)

于 2009-02-09T15:52:32.810 に答える
2

リストした 2 つのコードに機能上の違いはありません。内部では、両方のコードが匿名型を使用してクエリからデータを返します。

コードの最初の部分は、匿名型の使用を明示的にするだけです。この構文が許可されている理由は、Select 句から任意の型を返すことができるためです。ただし、型は明示的に使用する必要があります。

Dim x = From it in SomeCollection Select New Student With { .Name = it.Name }

2 番目のクエリが既存の型を使用する可能性があるという Joel の発言は正しくありません。明示的な型がない場合、明示的なプロパティ名を使用する select 句は常に匿名型を返します。

于 2009-02-09T16:19:49.190 に答える
1

違いはありません。コンパイラは匿名型を推測します。

e.<Surname>.ValueXElement の代わりに String を返す のように、要素の Value を返したい場合がほとんどです。

2番目の例は次のように簡略化できます

Dim ee = From e In someXML.<Employee> _
         Select e.<Surname>.Value, e.<Forename>.Value

コンパイラは匿名型のメンバーの名前も推測するためです。

ただし、次のクラスがある場合

Class Employee

    Private _surname As String
    Public Property Surname() As String
        Get
            Return _surname
        End Get
        Set(ByVal value As String)
            _surname = value
        End Set
    End Property

    Private _forename As String
    Public Property Forename() As String
        Get
            Return _forename
        End Get
        Set(ByVal value As String)
            _forename = value
        End Set
    End Property

End Class

IQueryable(Of Employee)次に、 New ... を使用して、最初のクエリを変更して、匿名型の代わりに を生成できます。

Dim ee = From e In someXML.<Employee> _
         Select New Employee With {.Surname = e.<Surname>.Value, _
                                   .Forename = e.<Forename>.Value}
于 2009-05-15T03:32:35.497 に答える
1

それらは匿名型と呼ばれます。

それらを使用する主な理由は、クエリからのデータを単一のオブジェクトに保持することです。これにより、反復子はオブジェクトのリストを反復処理し続けることができます。

これらは、大規模または複数パートの LINQ クエリの途中で、ストレージの一時的な型として機能する傾向があります。

于 2009-02-09T15:30:12.273 に答える
0

1つの違いは、匿名型はシリアル化できないことです。

于 2009-02-09T15:56:20.027 に答える