2010-10-23 46 views
25

Cách lấy khóa từ điển bằng cách sử dụng giá trị từ điển?Lấy khóa từ điển bằng cách sử dụng giá trị từ điển

khi nhận được giá trị sử dụng phím của nó như thế này:

Dictionary<int, string> dic = new Dictionary<int, string>(); 

dic.Add(1, "a"); 

Console.WriteLine(dic[1]); 
Console.ReadLine(); 

Làm thế nào để làm ngược lại?

+0

bản sao có thể có của [Lấy khóa giá trị của một từ điển chung?] (Http://stackoverflow.com/questions/255341/getting-key-of-value-of-a-generic-dictionary) – bluish

Trả lời

61

Từ điển thực sự được dùng để tra cứu một cách từ Khóa-> Giá trị.

Bạn có thể làm việc sử dụng LINQ ngược lại:

var keysWithMatchingValues = dic.Where(p => p.Value == "a").Select(p => p.Key); 

foreach(var key in keysWithMatchingValues) 
    Console.WriteLine(key); 

Nhận ra rằng có thể có nhiều phím với các giá trị như nhau, vì vậy bất kỳ tìm kiếm thích hợp sẽ trả về một tập hợp các phím (đó là lý do tại sao foreach tồn tại ở trên) .

+2

ack, beat tôi trong 35 giây! :) –

+0

Tôi sẽ đoán rằng đây có lẽ là nhanh hơn một cho mỗi thông qua keyvaluepairs nhưng không phải là nhanh hơn đảo ngược từ điển xung quanh huh? Tôi sẽ phải tự chuẩn bị nó để xem ra tò mò nhưng nó sẽ nhanh hơn khi làm từ điển khác biệt đúng không? – user99999991

+1

@ user999999928 Điều này về cơ bản là giống như thực hiện việc tìm kiếm mặc dù từ điển. Nếu bạn định thực hiện rất nhiều tra cứu, xây dựng một từ điển "đảo ngược" (yêu cầu một bộ sưu tập cho giá trị) sẽ làm cho tra cứu nhanh hơn, nhưng việc chèn/thay đổi sẽ cần phải được xử lý trong cả hai. –

21

Lực lượng vũ phu.

 int key = dic.Where(kvp => kvp.Value == "a").Select(kvp => kvp.Key).FirstOrDefault(); 
+2

+1 Đối với lực lượng vũ phu;) –

+4

int key = dic.FirstOrDefault (kvp => kvp.Value == "a"). – cilerler

+1

sẽ loại trừ ngoại lệ nếu không có khóa nào với giá trị đó. ('FirstOrDefault' trả về null, bạn lấy' .Key' của null) –

10

Bạn cũng có thể sử dụng phương pháp mở rộng sau đây để có được chìa khóa từ điển theo giá trị

public static class Extensions 
{ 
    public static bool TryGetKey<K, V>(this IDictionary<K, V> instance, V value, out K key) 
    { 
     foreach (var entry in instance) 
     { 
      if (!entry.Value.Equals(value)) 
      { 
       continue; 
      } 
      key = entry.Key; 
      return true; 
     } 
     key = default(K); 
     return false; 
    } 
} 

việc sử dụng cũng rất đơn giản

int key = 0; 
if (myDictionary.TryGetKey("twitter", out key)) 
{ 
    // successfully got the key :) 
} 
+0

+1) như zain đang nói một cách mới để thực hiện điều này thông qua các phương thức mở rộng. – Singleton

2

cách dễ dàng cho get một khóa:

public static TKey GetKey<TKey,TValue>(Dictionary<TKey, TValue> dictionary, TValue Value) 
    { 
     List<TKey> KeyList = new List<TKey>(dictionary.Keys); 
     foreach (TKey key in KeyList) 
      if (dictionary[key].Equals(Value)) 
       return key; 
     throw new KeyNotFoundException(); 
    } 

và cho các phím bội:

public static TKey[] GetKeys<TKey, TValue>(Dictionary<TKey, TValue> dictionary, TValue Value) 
    { 
     List<TKey> KeyList = new List<TKey>(dictionary.Keys); 
     List<TKey> FoundKeys = new List<TKey>(); 
     foreach (TKey key in KeyList) 
      if (dictionary[key].Equals(Value)) 
       FoundKeys.Add(key); 
     if (FoundKeys.Count > 0) 
      return FoundKeys.ToArray(); 
     throw new KeyNotFoundException(); 
    } 
0

Tôi nhận ra đây là một câu hỏi cũ nhưng muốn thêm một cái gì đó tôi nghĩ đến.

Nếu bạn biết sẽ chỉ có một khóa cho một giá trị và bạn sẽ phải tra cứu thông qua giá trị cũng như khóa; bạn có thể tạo hai từ điển riêng biệt. Một với khóa gốc là khóa và giá trị làm giá trị và giá trị thứ hai có khóa làm giá trị và giá trị làm khóa.

Bây giờ, lưu ý phụ về điều này; nó sử dụng nhiều tài nguyên máy hơn nhưng tôi đoán nó nhanh hơn sau đó brute buộc thông qua LINQ và foreach.

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