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>.