2010-11-16 26 views
6
public static Dictionary<int, string> dic = new Dictionary<int, string>() { 
      {1,"anystring1"}, 
      {2,"anystring2"}}; 

tôi cần phải sử dụng nàylàm thế nào để sử dụng từ điển hai chiều trong C#

string str= dic[1]; // it is possible 

int a=dic["anystring1"]; // My dream is it 
+1

Có khả năng trùng lặp: http://stackoverflow.com/questions/268321 –

+2

bản sao có thể có của [Từ điển 1 đến 1 hai chiều trong C#] (http://stackoverflow.com/questions/268321/bidirectional-1-to- 1-dictionary-in-c) –

+0

và http://stackoverflow.com/questions/255341 – AlexFoxGill

Trả lời

2

Đó không phải là những gì một cuốn từ điển có nghĩa là để làm. Bạn có thể nghĩ ra một định nghĩa và ngay lập tức tìm từ phù hợp trong từ điển yêu thích của mình trong thời gian O(1) không? Nếu bạn muốn một lớp học với loại chức năng đó (một từ điển hai chiều), bạn sẽ phải tự xây dựng nó (hoặc Google cho một trong nhiều triển khai trên Internet).

7

Sử dụng một Dictionary<> và sử dụng nó theo thứ tự ngược lại của khóa/giá trị.

5

Tôi hơi muộn một ngày này, nhưng LINQ là bạn của bạn ở đây:

MyDict.FirstOrDefault(pair => pair.Value == "the value you want").Key; 

Cho phép bạn làm những gì bạn muốn.

+2

Bạn có thể muốn thử 'myDict.FirstOrDefault (pair => pair.Value == "những gì bạn muốn"). Key;' thay thế. – Nobody

+0

@rmx có bạn nói đúng, tôi đã cập nhật câu trả lời của mình. –

+0

tôi sẽ không mua phần mềm của bạn –

4

Tôi ước điều này nằm trong thư viện Hệ thống, nhưng khá dễ dàng để cuộn của riêng bạn.

Dưới đây, tôi sẽ cung cấp cho bộ xương của việc viết một lớp như thế, mà sử dụng trông giống như:

var twoWayDict = new TwoWayDict<string, int>(); 

twoWayDict["zero"] = 0; 
// twoWayDict["zero"] == 0 
// twoWayDict.Reverse[0] == "zero" 

twoWayDict.Reverse[1] = "one"; 
// twoWayDict["one"] == 1 
// twoWayDict.Reverse[1] == "one" 

Hãy nhớ, một Gotcha cho một cuốn từ điển hai chiều là bạn nên mong đợi tất cả các đầu vào được liên kết chặt chẽ. Nói cách khác, nếu bạn sử dụng lại khóa HOẶC một giá trị, bạn sẽ xóa dữ liệu được liên kết trước đó với một trong hai cách:

Cuối cùng, đây là một số mã mẫu. Nó tối thiểu - nó sẽ hoạt động như một nền tảng cho bất cứ ai muốn ăn thịt phiên bản của riêng họ. Lưu ý rằng tôi triển khai một lớp trình bao bọc để tôi có thể cung cấp thuộc tính "Đảo ngược" mà không trực tiếp hiển thị từ điển nội bộ.

// Generics note: K indicates "key" type and V indicates "value" type 
using System.Collections.Generic; 

namespace YourNamespaceHere.Collections 
{ 
    public class TwoWayDict<K, V> 
    { 
    private Dictionary<K, V> _dictKV; 
    private Dictionary<V, K> _dictVK; 
    private ReverseDict _reverseDict; 

    public TwoWayDict() 
    { 
     _dictKV = new Dictionary<K, V>(); 
     _dictVK = new Dictionary<V, K>(); 
     _reverseDict = new ReverseDict(this); 
    } 

    public ReverseDict Reverse 
    { 
     get { return _reverseDict; } 
    } 

    // TwoWayDict[key] -> value 
    public V this[K key] 
    { 
     get { return _dictKV[key]; } 
     set 
     { 
     // Remove any existing key/value pair 
     Remove(key); 

     _dictKV[key] = value; 
     _dictVK[value] = key; 
     } 
    } 

    public void Remove(K key) 
    { 
     if (_dictKV.ContainsKey(key)) 
     { 
     _dictVK.Remove(_dictKV[key]); 
     _dictKV.Remove(key); 
     } 
    } 

    // Wrapper that allows TwoWayDict to expose a convenient 
    // 'Reverse' property. 
    public class ReverseDict 
    { 
     private TwoWayDict<K, V> _parent; 
     public ReverseDict(TwoWayDict<K, V> parent) 
     { 
     _parent = parent; 
     } 

     public K this[V reverseKey] 
     { 
     get { return _parent._dictVK[reverseKey]; } 
     set { _parent[value] = reverseKey; } 
     } 

     public void Remove(V value) 
     { 
     if (_parent._dictVK.ContainsKey(value)) 
     { 
      _parent.Remove(_parent._dictVK[value]); 
     } 
     } 
    }  
    } 
} 
+0

Rất hữu ích nhưng khi bạn gọi một dữ liệu không tồn tại chức năng không hoạt động – cmujica

0

Tôi thực sự sử dụng lớp kết hợp ArrayList với từ điển để tôi có thể tra cứu các nút con dựa trên tên hoặc thứ tự được thêm và duy trì thứ tự ban đầu của các đối tượng khi chúng được thêm vào.

Đối tượng được thêm vào ArrayList trước, sau đó chỉ mục của đối tượng đó trong ArrayList được thêm vào từ điển bằng phím mong muốn.

Điều này cho phép tôi truy cập bằng khóa hoặc vị trí, theo cách rất tối ưu, đồng thời duy trì thứ tự của các đối tượng khi chúng được thêm vào.

Khu vực cần xem để thêm đối tượng khác bằng cách sử dụng khóa hiện có, sẽ loại bỏ đối tượng gốc và xóa bất kỳ phần tử nào khỏi vectơ sẽ làm cho các chỉ mục trong Từ điển bị hỏng, trỏ đến giá trị sai.

Chỉ cần nghĩ rằng tôi sẽ chia sẻ hai xu giá trị của tôi - hy vọng nó sẽ giúp một ai đó.

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