Tengo un objeto Message que ajusta un formato de mensaje que no tengo control. El formato es una lista simple de pares clave/valor. Quiero extraer una lista de usuarios de un mensaje dado. Por ejemplo, dada la siguiente mensaje ...Reemplazar bucle for-switch con una consulta 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
Quiero extraer cuatro usuarios con las propiedades proporcionadas establecidos. Las claves iniciales 200/300 .... 405 representan campos que no necesito y pueden omitir para acceder a los datos de usuario.
Cada uno de los datos de los usuarios está en campos consecutivos pero el número de campos varía según la cantidad de información que se tenga sobre un usuario. El siguiente método hace lo que estoy buscando. Utiliza una enumeración de posibles tipos de clave y un método para encontrar el índice del primer campo con datos de usuario.
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;
}
Me pregunto si es posible reemplazar el método con una consulta de Linq. Tengo problemas para decirle a Linq que seleccione un nuevo usuario y llene sus campos con todos los datos coincidentes hasta que encuentre el inicio de la siguiente entrada de usuario.
Nota: Los números de clave relativa son aleatorios (no 1,2,3,4) en el formato de mensaje real.
¿Estás utilizando Resharper? es bastante bueno para refactorizar bucles a expresiones LINQ. –
¿Cuál sería el beneficio de convertir esto en una consulta LINQ? Tu código se ve bien para mí tal como es. – dtb
@Marian: solo después de 5.x IIRC – sehe