Đối với học sinh nội bộ tôi đã viết BiDictionary
. Nó không phải là bằng chứng chống đạn bởi tôi không phơi bày nó cho người dùng để nó hoạt động tốt cho tôi. Nó cho phép tôi lấy chìa khóa khi tôi cần.
KeyPair<,>
là cần thiết để có thể triển khai IEnumerable<,>
và do đó phương pháp Add
để chúng tôi có thể sử dụng trình khởi tạo đối tượng.
internal class KeyPair<TKey1, TKey2>
{
public TKey1 Key1 { get; set; }
public TKey2 Key2 { get; set; }
}
Đây là lớp học chính là một đối tượng năng động để chúng tôi có thể sử dụng tên chủ chốt trên đó khi lấy giá trị:
internal class BiDictionary<TKey1, TKey2> : DynamicObject, IEnumerable<KeyPair<TKey1, TKey2>>
{
private readonly Dictionary<TKey1, TKey2> _K1K2 = new Dictionary<TKey1, TKey2>();
private readonly Dictionary<TKey2, TKey1> _K2K1 = new Dictionary<TKey2, TKey1>();
private readonly string _key1Name;
private readonly string _key2Name;
public BiDictionary(string key1Name, string key2Name)
{
_key1Name = key1Name;
_key2Name = key2Name;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (binder.Name == _key1Name)
{
result = _K1K2;
return true;
}
if (binder.Name == _key2Name)
{
result = _K2K1;
return true;
}
result = null;
return false;
}
public void Add(TKey1 key1, TKey2 key2)
{
_K1K2.Add(key1, key2);
_K2K1.Add(key2, key1);
}
public IEnumerator<KeyPair<TKey1, TKey2>> GetEnumerator()
{
return _K1K2.Zip(_K2K1, (d1, d2) => new KeyPair<TKey1, TKey2>
{
Key1 = d1.Key,
Key2 = d2.Key
}).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Ví dụ:
dynamic bidic = new BiDictionary<string, string>("Key1", "Key2")
{
{ "foo", "bar" },
{ "baz", "qux" }
};
var bar = bidic.Key1["foo"];
var foo = bidic.Key2["bar"];
Họ có thể không đồng bộ nếu bạn sửa đổi bất kỳ từ điển nào bên ngoài. Với mục đích này, tôi sử dụng ObservableDictionary
để tôi có thể cập nhật một cái khác nếu một thay đổi nhưng vì mục đích đơn giản, tôi đã xóa phần này của mã để chỉ phân tách logic chính.
Tạo phần giá trị của khóa. –
Không có lớp nào trong .NET Framework. Nhưng bạn có thể dễ dàng xây dựng một trong một từ điển và một HashSet hoặc hai từ điển. – dtb
@Robert Harvey: nếu anh ta làm điều đó anh ta không thể làm 'd [1]' nữa, điều đó đánh bại mục đích của từ điển. Cũng có thể sử dụng HashSet <> –