2012-07-06 38 views
6

Tôi chỉ làm việc trên một Kata vào bữa trưa của tôi và tôi đã đi lột ...LINQ - rẽ Danh sách <string> vào Dictionary <string, string>

Dưới đây là các bước tôi đang cố gắng để làm theo:

  • với một chuỗi đầu vào, chia chuỗi bằng ký tự dòng mới
  • với mảng chuỗi kết quả của các bước trước, bỏ qua các yếu tố đầu tiên trong mảng
  • với bộ sưu tập của chuỗi kết quả từ trước bước, tạo một bộ sưu tập gồm 2 e lements

Trong đó tuyên bố cuối cùng những gì tôi muốn nói là, với bộ sưu tập này của 4 dây:

{ 
    "string1", 
    "string2", 
    "string3", 
    "string4" 
} 

tôi nên kết thúc với bộ sưu tập này của các cặp (là 'tuples' thuật ngữ phải không?):

{ 
    { "string1","string2" }, 
    { "string3","string4" } 
} 

Tôi bắt đầu xem ToDictionary, sau đó chuyển sang chọn loại ẩn danh nhưng tôi không chắc chắn cách nói "trả về hai chuỗi tiếp theo dưới dạng cặp".

Mã của tôi trông giống như này tại thời điểm viết:

public void myMethod() { 

    var splitInputString = input.Split('\n'); 

    var dic = splitInputString.Skip(1).Select(/* each two elements */); 
} 

Chúc mừng cho sự giúp đỡ!

James

Trả lời

4

Vâng, bạn có thể sử dụng (chưa được kiểm tra):

var dic = splitInputStream.Zip(splitInputStream.Skip(1), 
           (key, value) => new { key, value }) 
          .Where((pair, index) => index % 2 == 0) 
          .ToDictionary(pair => pair.key, pair => pair.value); 

Phần Zip sẽ kết thúc với:

{ "string1", "string2" } 
{ "string2", "string3" } 
{ "string3", "string4" } 

... và Where cặp bằng cách sử dụng chỉ số sẽ bỏ qua mọi mục nhập khác (sẽ là "giá trị với khóa tiếp theo").

Tất nhiên nếu bạn thực sựbiết bạn đã có một List<string> để bắt đầu, bạn chỉ có thể truy cập vào các cặp theo chỉ số, nhưng đó là nhàm chán ...

+0

Chính xác những gì tôi đang tìm kiếm! Tôi không biết về Zip - cảm ơn vì điều đó. –

Các vấn đề liên quan