Ho un oggetto Message che racchiude un formato di messaggio su cui non ho il controllo. Il formato è un semplice elenco di coppie chiave/valore. Voglio estrarre un elenco di utenti da un determinato messaggio. Per esempio dato il seguente messaggio ...Sostituisci il ciclo per switch con una query Linq
1. 200->....
2. 300->....
3. ....
4. 405->....
5. 001->first_user_name
6. 002->first_user_phone
7. 003->first_user_fax
8. 001->second_user_name
9. 001->third_user_name
10. 002->third_user_phone
11. 003->third_user_fax
12. 004->third_user_address
13. .....
14. 001->last_user_name
15. 003->last_user_fax
Voglio estrarre quattro Utenti con le proprietà fornite impostate. I tasti iniziali 200/300 .... 405 rappresentano campi non necessari e possono saltare per accedere ai dati utente.
Ogni dato utente è in campi consecutivi ma il numero di campi varia a seconda della quantità di informazioni che si conoscono su un utente. Il seguente metodo fa quello che sto cercando. Utilizza un'enumerazione di possibili tipi di chiave e un metodo per trovare l'indice del primo campo con i dati dell'utente.
private List<User> ParseUsers(Message message)
{
List<User> users = new List<User>();
User user = null; String val = String.Empty;
for(Int32 i = message.IndexOfFirst(Keys.Name); i < message.Count; i++)
{
val = message[ i ].Val;
switch(message[ i ].Key)
{
case Keys.Name:
user = new User(val);
users.Add(user);
break;
case Keys.Phone:
user.Phone = val;
break;
case Keys.Fax:
user.Fax = val;
break;
case Keys.Address:
user.Address = val;
break;
default:
break;
}
}
return users;
}
Mi chiedo se è possibile sostituire il metodo con una query Linq. Ho difficoltà a comunicare a Linq di selezionare un nuovo utente e popolare i suoi campi con tutti i dati corrispondenti finché non trovi l'inizio della successiva voce utente.
Nota: i numeri chiave relativi sono casuali (non 1,2,3,4) nel formato di messaggio reale.
stai usando Resharper? è abbastanza bravo nel refactoring dei loop alle espressioni LINQ. –
Quale sarebbe il vantaggio di trasformare questo in una query LINQ? Il tuo codice mi sembra buono così com'è. – dtb
@Marian: solo dopo 5.x IIRC – sehe