代码之家  ›  专栏  ›  技术社区  ›  Totty

什么可以用作双面资源字典?

  •  6
  • Totty  · 技术社区  · 16 年前

    我使用的是资源字典,但我希望能够在其他项中查找值或键。每个都是独一无二的,所以这不是问题。是否有具有此双面查找功能的类型?

    2 回复  |  直到 16 年前
        1
  •  7
  •   Craig Wilson    16 年前

    不是内置的,但这很容易写。不过,我可能会为此实现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];
      }
    
    
    }
    
        2
  •  2
  •   benjismith    16 年前

    在逆转字典中的键/值关系时要非常小心。

    字典的契约保证,对于集合中的每个值,都只有一个键映射到该值。钥匙是独一无二的。但反过来也不正确;对于每个不同的值,可以有许多不同的键映射到该值。

    在我自己的个人代码库(用Java编写的,已经足够接近)中,我有MultIAP类来处理这种事情。尽管键是唯一的,但每个键都可以与多个值关联。它与地图完全相同。

    当我需要执行集合中键查找的值时,我会这样做:

    Map<K, V> lookupTable = ...;
    MultiMap<V, K> reverseLookupTable = MapUtil.invert(lookupTable);
    
    V value = ...;
    if (reverseLookupTable.containsKey(value)) {
       Set<K> keys = reverseLookupTable.get(value);
    }
    

    如果使用多映射以外的其他内容(如哈希映射或字典)作为反向查找表,则可能会丢失某些v->k映射,除非可以确保集合中的所有键和所有值都是唯一的。


    编辑:

    哎呀。我刚注意到你说过你收藏的所有钥匙和价值观都是独一无二的。但无论如何,我会把我的答案留在这里,作为对其他阅读这篇文章的人的警告,他们可能无法提供同样的保证。