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

LINQ: Unione di due sorgenti e filtro con metodi Extension

Tra le varie opportunità messe a disposizione da LINQ, molte rientrano nell'ambito dei metodi Extension. In questo post vedremo come, tramite i metodi Union e Where, sia possibile unire due sorgenti dati separate ma dello stesso tipo e filtrarle successivamente.

Supponiamo di avere due distinti file XML, ciascuno contenente una piccola lista di contatti. Primo file (Contatti.Xml):

<?xml version="1.0" encoding="utf-8" ?>

 

<Contatti>

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

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

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

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

  <Contatto Nome="Gianluca" Città="Firenze"/>

</Contatti>

Secondo file (ContattiDue.Xml):

<?xml version="1.0" encoding="utf-8" ?>

 

<Contatti>

  <Contatto Nome="Luciano" Città="Padova"/>

  <Contatto Nome="Maurizio" Città="Milano"/>

  <Contatto Nome="Renato" Città="Varese"/>

  <Contatto Nome="Sergio" Città="Vicenza"/>

</Contatti>

In primo luogo, quindi, carichiamo i dati dal primo documento ed assegnamo a una collezione di tipi anonimi il risultato:

        Dim doc As XDocument = XDocument.Load("Contatti.xml")

 

        Dim risultato = From persona In doc...<Contatti>.<Contatto> _

                      Select Nome = persona.@Nome, Città = persona.@Città

Lavoro analogo viene svolto sul secondo documento che, come si è visto, ha struttura uguale:

        Dim secondDoc As XDocument = XDocument.Load("ContattiDue.xml")

 

        Dim secondoRisultato = From persona In secondDoc...<Contatti>.<Contatto> _

                      Select Nome = persona.@Nome, Città = persona.@Città

Ora, utilizzando il metodo extension chiamato Union, possiamo unire le due sorgenti assegnandole a una variabile:

Dim unione = risultato.Union(secondoRisultato)

Utilizzeremo ora una "finezza" per estrarre da questa unione di dati solo i contatti i cui nomi iniziano con la lettera "M". Per farlo, utilizziamo una espressione lambda di questo tipo:

        For Each persona In unione.Where(Function(Contatto) Contatto.Nome.StartsWith("M"))

            Console.WriteLine("{0}, {1}", persona.Nome, persona.Città)

        Next

        Console.Read()

Il metodo extension Where accetta come argomento una lambda expression che rappresenta ciascun contatto (quindi, ciascun elemento della collection di anonymous types).

Il risultato del ciclo mostrerà, infine, i soli due nomi che iniziano con la "M", quindi, nel caso di specie, Mario e Maurizio.

Alessandro

 

 

 

Print | posted on sabato 5 aprile 2008 20:35 | Filed Under [ Visual Basic LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET