2008-11-18 23 views

Trả lời

7

Không được tích hợp sẵn, nhưng điều này khá dễ viết. Tôi có lẽ sẽ thực hiện IDictionary cho điều này mặc dù ... Sau đó bạn sẽ đổ ResourceDictionary vào loại tùy chỉnh của bạn.

public class DoubleLookup<TKey, TValue> 
{ 
    private IDictionary<TKey, TValue> keys; 
    private IDictionary<TValue, TKey> values; 

    //stuff... 

    public void Add(TKey key, TValue value) 
    { 
    this.keys.Add(key, value); 
    this.values.Add(value, key); 
    } 

    public TKey GetKeyFromValue(TValue value) 
    { 
    return this.values[value]; 
    } 

    public TValue GetValueFromKey(TKey key) 
    { 
    return this.keys[key]; 
    } 


} 
2

Hãy cẩn thận khi đảo ngược mối quan hệ khóa/giá trị trong từ điển.

Hợp đồng của từ điển đảm bảo rằng, đối với mọi giá trị trong bộ sưu tập, có chính xác một khóa ánh xạ tới giá trị đó. Các phím là duy nhất. Nhưng ngược lại không đúng; đối với mọi giá trị riêng biệt, có thể có nhiều ánh xạ khóa khác nhau cho giá trị đó.

Trong thư viện mã cá nhân của riêng tôi (viết bằng Java, đủ gần), tôi có lớp MultiMap cho loại điều này. Mặc dù các phím là duy nhất, mỗi khóa có thể được liên kết với nhiều giá trị. Nó giống hệt với Bản đồ>.

Khi tôi cần phải thực hiện giá trị-to-key tra cứu trong bộ sưu tập, tôi làm điều gì đó như thế này:

Map<K, V> lookupTable = ...; 
MultiMap<V, K> reverseLookupTable = MapUtil.invert(lookupTable); 

V value = ...; 
if (reverseLookupTable.containsKey(value)) { 
    Set<K> keys = reverseLookupTable.get(value); 
} 

Nếu bạn sử dụng một cái gì đó khác hơn là một Multimap (như một HashMap hoặc từ điển) là ngược lại của bạn - bảng tra cứu, bạn có nguy cơ mất một số ánh xạ V-> K, trừ khi bạn có thể đảm bảo rằng tất cả các khóa và tất cả các giá trị trong bộ sưu tập của bạn là duy nhất.


EDIT:

Rất tiếc. Tôi chỉ nhận thấy rằng bạn đã nói rằng tất cả các khóa và giá trị trong bộ sưu tập của bạn là duy nhất. Nhưng tôi sẽ để lại câu trả lời của tôi ở đây dù sao đi nữa, như một lời cảnh báo cho những người khác đang đọc cái này, những người có thể không có khả năng đảm bảo như vậy.

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