Technology Experience
.NET World

Da una embedded resource a IEnumerable<T> con Linq

Data la classe ContactFieldImport così implementata:

   1: public class ContactFieldImport
   2: {
   3:     public string Property { get; internal set; }
   4:     public string Field { get; internal set; }
   5:  
   6:     public ContactFieldImport() { }
   7:  
   8:     public ContactFieldImport(string property, string field)
   9:     {
  10:         Property = property;
  11:         Field = field;
  12:     }
  13: }

vogliamo creare una struttura IEnumerable<ContactFieldImport> popolata con una embedded resource definita nell’assembly locale.

Questa risorsa è un normale file di testo e contiene quanto segue:

FullName;Denominazione|
ManagerName;Titolare|
HomeAddress;Indirizzo|
HomeAddressPostalCode;CAP|
HomeAddressCity;Città|
HomeAddressState;Provincia|
Email1Address;Mail|
Body;Note|
CompanyName;RagioneSocialeFiscale|
BusinessAddress;IndirizzoFiscale|
BusinessAddressPostalCode;CapFiscale|
BusinessAddressCity;CittàFiscale|
BusinessAddressState;ProvinciaFiscale|
GovernmentIDNumber;PartitaIva|
OtherAddressCity;LuogoNascita|
OtherAddressCountry;Cittadinanza|
OrganizationalIDNumber;Matricola|

Ogni riga contiene una coppia Property/Field. Ho usato il pipe ‘|’ come separatore per le linee, e un ‘;’ per separare i due campi.

Possiamo farlo con Linq? Certo, con una piccola funzione come questa:

   1: private static void setupMappings()
   2: {
   3:     string mappingsFile = CoreServices.GetResourceContents("VivendoByte.MyProject.Core.ContactMapping.txt");
   4:     string[] lines = mappingsFile.Split('|');
   5:  
   6:     mappings = from l in lines
   7:                where (l.Length > 0)
   8:                let splitted = l.Split(';')
   9:                    select new ContactFieldImport
  10:                    {
  11:                        Property = splitted[0],
  12:                        Field = splitted[1]
  13:                    };
  14: }

La riga (3) restituisce tramite un metodo statico il contenuto della risorsa illustrata prima. Splitto le righe usando come separatore il carattere pipe ‘|’ (riga 4). Questa operazione di splitting restituisce un array di stringhe che – lo ricordiamo – è un oggetto interrogabile con Linq. Le righe 6-13 compongono una query Linq applicata su un string[]: filtro solamente le righe il cui .Length > 0, poi splitto e metto il risultato in un oggetto splitted. Per ogni riga restituisco un oggetto ContactFieldImport che va a popolare l’oggetto mappings dichiarato come IEnumerable<ContactFieldImport>.

Send to Kindle

Igor Damiani

La sua passione per l'informatica nasce nella prima metà degli anni '80, quando suo padre acquistò un Texas Instruments TI-99. Da allora ha continuato a seguire l'evoluzione sia hardware che software avvenuta nel corso degli anni. E' un utente, un videogiocatore ed uno sviluppatore software a tempo pieno. Igor ha lavorato e lavora anche oggi con le più moderne tecnologie Microsoft per lo sviluppo di applicazioni: .NET Framework, XAML, Universal Windows Platform, su diverse piattaforme, tra cui spiccano Windows 10 piattaforme mobile. Numerose sono le app che Igor ha creato e pubblicato sul marketplace sotto il nome VivendoByte, suo personale marchio di fabbrica. Adora mantenere i contatti attraverso Twitter e soprattutto attraverso gli eventi delle community .NET.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.