2017-07-05 22 views
6

Tôi gặp sự cố khi tìm kiếm từ điển giống như thế này.Tìm kiếm giá trị từ điển và trả lại Danh sách các phím điều kiện đáp ứng

Dictionary<string, string[]> dic = new Dictionary<string, string[]>(){ 
    {"a", new string[](){"a_val","2"}}, 
    {"b", new string[](){"b_val","1"}}, 
    {"b", new string[](){"b_val","0"}} 
}; 

Tôi cần phải trả lại một danh sách của Keys trong đó giá trị của [1] nguyên tố stingArray lớn hơn "1" như:

List<string> list = new List<string>{ 
    "a" 
}; 

Bởi vì tôi không giỏi sử dụng LINQ, giải pháp hiện tại của tôi đang lặp qua từ điển và thêm các khóa vào danh sách mới. Nhưng phương pháp đó trông xấu xí và tôi đang cố gắng tìm một giải pháp khác cho vấn đề.

+0

Wht do the double Asterisks (**) stand for? –

+1

@CasparKleijne Không áp dụng ** đậm ** định dạng. –

+1

Tôi muốn làm nổi bật chỉ mục đó, nhưng điều đó không hoạt động ở định dạng mã. Tôi sẽ xóa nó. – McNade

Trả lời

11

Nếu không có bất kỳ xử lý lỗi:

var list = dic.Where(x => int.Parse(x.Value[1]) > 1) 
       .Select(x => x.Key) 
       .ToList(); 

Với tuyên bố Where các mục nơi Value[1] lớn hơn 1 sẽ được lọc và với câu lệnh Select, từ khóa này sẽ được chọn. Ít nhất bộ sưu tập sẽ được chuyển đổi theo số List bằng phương pháp ToList.

Để biết thêm thông tin, hãy xem 101 LINQ Samples in C#

+0

Cảm ơn bạn, nó hoạt động hoàn hảo và những mẫu là tuyệt vời. – McNade

+1

Chào mừng bạn :-) –

+1

@MightyBadaboom Bạn cũng được chào đón ;-) –

3

Hãy thử điều này (Bạn định nghĩa từ điển có một số lỗi biên dịch và tôi thực hiện một số dự đoán):

 static void Main(string[] args) 
    { 
     var dic = new Dictionary<string, string[]>(){ 
     {"a", new string[]{"a_val","2"}}, 
     {"b", new string[]{ "b_val","1"}}, 
     {"c", new string[]{ "b_val","0"}}}; 
     string[] expected = dic 
      .Where(kv => Convert.ToInt32(kv.Value[1]) > 1) 
      .Select(kv => kv.Key).ToArray(); 
    } 
Các vấn đề liên quan