【发布时间】:2008-11-18 19:37:31
【问题描述】:
我正在使用 ResourceDictionary,但我希望能够使用其他项目查找值或键。每个都是独一无二的,所以这不是问题。有没有这种双面查找功能的类型?
【问题讨论】:
标签: c# resourcedictionary
我正在使用 ResourceDictionary,但我希望能够使用其他项目查找值或键。每个都是独一无二的,所以这不是问题。有没有这种双面查找功能的类型?
【问题讨论】:
标签: c# resourcedictionary
不是内置的,但这很容易编写。不过,我可能会为此实现 IDictionary...然后您将 ResourceDictionary 转储到您的自定义类型中。
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];
}
}
【讨论】:
在反转字典中的键/值关系时要非常小心。
字典的契约保证,对于集合中的每个值,都有一个映射到该值的键。钥匙是独一无二的。但反过来则不然。对于每个不同的值,可以有许多不同的键映射到该值。
在我自己的个人代码库(用 Java 编写,非常接近)中,我有 MultiMap 类来处理这类事情。尽管键是唯一的,但每个键都可以与多个值相关联。它与地图完全相同>。
当我需要在集合中执行 value-to-key 查找时,我会这样做:
Map<K, V> lookupTable = ...;
MultiMap<V, K> reverseLookupTable = MapUtil.invert(lookupTable);
V value = ...;
if (reverseLookupTable.containsKey(value)) {
Set<K> keys = reverseLookupTable.get(value);
}
如果您使用 MultiMap 以外的其他东西(如 HashMap 或 Dictionary)作为反向查找表,则可能会丢失一些 V->K 映射,除非您可以保证所有键和所有值在您的收藏中是独一无二的。
编辑:
哎呀。我刚刚注意到您说您的集合中的所有键和值都是唯一的。但无论如何,我会在这里留下我的答案,作为对阅读本文的其他人的警告,他们可能无法提供相同的保证。
【讨论】: