Tôi có đối tượng Tin nhắn bao bọc định dạng tin nhắn mà tôi không có quyền kiểm soát. Định dạng là danh sách các cặp khóa/giá trị đơn giản. Tôi muốn trích xuất một danh sách Người dùng từ một Tin nhắn đã cho. Ví dụ: được cung cấp thông báo sau ...Thay thế vòng lặp chuyển mạch bằng truy vấn 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
Tôi muốn trích xuất bốn Người dùng bằng tập hợp thuộc tính được cung cấp. Các phím ban đầu 200/300 .... 405 đại diện cho các trường mà tôi không cần và có thể bỏ qua để chuyển đến dữ liệu Người dùng.
Mỗi dữ liệu người dùng ở các trường liên tiếp nhưng số trường khác nhau tùy thuộc vào lượng thông tin được biết về người dùng. Phương pháp sau đây thực hiện những gì tôi đang tìm kiếm. Nó sử dụng một liệt kê các kiểu khóa có thể và một phương thức để tìm chỉ mục của trường đầu tiên với dữ liệu người dùng.
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;
}
Tôi tự hỏi nếu có thể thay thế phương thức bằng truy vấn LINQ. Tôi gặp sự cố khi yêu cầu Linq chọn một người dùng mới và điền vào các trường của nó với tất cả dữ liệu phù hợp cho đến khi bạn tìm thấy bắt đầu của mục nhập người dùng tiếp theo.
Lưu ý: Số khóa tương đối là ngẫu nhiên (không phải 1,2,3,4) theo định dạng thư thực.
bạn đang sử dụng Resharper? nó khá tốt ở các vòng tái cấu trúc cho các biểu thức LINQ. –
Lợi ích của việc biến điều này thành truy vấn LINQ là gì? Mã của bạn trông rất tuyệt với tôi. – dtb
@Marian: chỉ sau 5.x IIRC – sehe