Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Esempio d'uso di anonymous types in LINQ-To-XML (VB 2008)

In questo post vediamo come utilizzare LINQ-to-XML (detto anche XLINQ) per leggere informazioni da un'ipotetica lista di contatti e popolare una ListView con queste informazioni, ricorrendo all'uso dei tipi anonimi.

In un'applicazione Windows Forms di esempio è presente una ListView, con tre colonne: Nome, Città e ID (ricordate, quindi, di impostare la proprietà View su Details). Il seguente file Xml può costituire la base su cui lavorare:

<?xml version="1.0"?>

<Contatti>

  <Contatto Nome="Alessandro" Città="Cremona" ID="1"/>

  <Contatto Nome="Mario" Città="Belluno" ID="2"/>

  <Contatto Nome="Diego" Città="Trieste" ID="3"/>

  <Contatto Nome="Antonio" Città="Milano" ID="4"/>

</Contatti>

Ipotizzando di voler popolare la ListView al caricamento dell'applicazione con una tecnica piuttosto rapida, iniziamo a scrivere il seguente codice nell'evento Load della finestra:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 

        Dim elementi(2) As String

        Dim itm As ListViewItem

 

        'Carico il documento

        Dim doc = XDocument.Load(Application.StartupPath + "\Contatti.xml")

 

        'Recupero tutti i nodi discendenti chiamati Contatto

        'li ordino in base all'attributo Nome di ciascuno di essi

        'seleziono le proprietà di interesse, che confluiscono in

        'un anonymous type

        Dim risultato = From contatto In doc...<Contatto> _

                        Order By contatto.@Nome _

                        Select Nome = contatto.@Nome, Città = contatto.@Città, ID = contatto.@ID

Nella query expression accade questo (si notino anche i commenti al codice):

  1. si selezionano tutti gli elementi discendenti del documento, contraddistinti dall'identificatore Contatto (sintassi ...<>)
  2. si ordinano gli elementi in base all'attributo Nome (sintassi .@) di ciascun elemento Contatto
  3. si selezionano i valori degli attributi Nome, Città e ID di ciascun elemento Xml Contatto assegnando detti valori a delle variabili.

La selezione di questi valori confluisce automaticamente in una collection di tipi anonimi che, come si può intuire, trovano il loro naturale utilizzo proprio nelle query expression. Tale collection di tipi anonimi può essere normalmente iterata, al fine di popolare il controllo:

        For Each persona In risultato

 

            elementi(0) = persona.Nome

            elementi(1) = persona.Città

            elementi(2) = persona.ID

            itm = New ListViewItem(elementi)

 

            ListView1.Items.Add(itm)

        Next

    End Sub

Il risultato a video sarà il seguente:

Si potrebbe poi rifinire ulteriormente l'interrogazione aggiungendo una clausola Where. Il seguente snippet mostra la selezione dei soli nomi che iniziano con la lettera A:

        Dim risultato = From contatto In doc...<Contatto> _

                        Order By contatto.@Nome _

                        Where contatto.@Nome.StartsWith("A") _

                        Select Nome = contatto.@Nome, Città = contatto.@Città, ID = contatto.@ID

Alessandro

Print | posted on domenica 30 marzo 2008 17:34 | Filed Under [ Visual Basic LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET