【问题标题】:What could be used as a double sided Resource Dictionary?什么可以用作双面资源字典?
【发布时间】:2008-11-18 19:37:31
【问题描述】:

我正在使用 ResourceDictionary,但我希望能够使用其他项目查找值或键。每个都是独一无二的,所以这不是问题。有没有这种双面查找功能的类型?

【问题讨论】:

    标签: c# resourcedictionary


    【解决方案1】:

    不是内置的,但这很容易编写。不过,我可能会为此实现 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】:

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

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

      在我自己的个人代码库(用 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 映射,除非您可以保证所有键和所有值在您的收藏中是独一无二的。


      编辑:

      哎呀。我刚刚注意到您说您的集合中的所有键和值都是唯一的。但无论如何,我会在这里留下我的答案,作为对阅读本文的其他人的警告,他们可能无法提供相同的保证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多