【问题标题】:Dictionary without unique keys没有唯一键的字典
【发布时间】:2011-06-10 11:05:01
【问题描述】:

我有一个 Dictionary 和一些简单的 string,string 值对。问题是有时键对于多个项目必须为空,这会导致字典错误 ->

这个键已经存在。

还有其他的课程吗?

另外,我使用的是 .NET 2.0,所以我不能使用 Tuple 类...

while (nav.MoveToNext())
{
    if (nav != null)
    {
        if (!String.IsNullOrEmpty(nav.Value))
        {
            if (nav.HasChildren)
            {
                navChildren = nav.Clone();
                navChildren.MoveToFirstChild();
                if (navChildren != null)
                    if (!veldenToSkip.Contains(nav.LocalName.Trim().ToLower())
                        && !nav.LocalName.StartsWith("opmerkingen_"))
                        itemTable.Add(nav.LocalName.Replace("_", " "), navChildren.Value);
                         //normal key and value
                while (navChildren.MoveToNext())
                {
                    if (!veldenToSkip.Contains(nav.LocalName.Trim().ToLower()))
                    {
                        if (navChildren != null)
                        {
                            if (!String.IsNullOrEmpty(navChildren.Value))
                            {
                                itemTable.Add("", navChildren.Value);
                                //Add blank keys
                            }
                        }
                    }
                }
            }
        }
    }
}

我只想要这样的结构:

value1    value2
value3    value4
          value5
          value6
value7    value8
...

【问题讨论】:

  • 为什么您的字典中需要一个没有键的值对?以后怎么找?考虑在您拥有键或翻转字典(切换键和值)之前不要添加值对。
  • @aligray 我不认为那是一样的,他希望允许同一个键有多个条目,而不是每个条目有多个键。
  • 你想为一个空键返回什么(当存储多个值时)?

标签: c# .net generics


【解决方案1】:

你可以实现 ILookup 接口...

包装一个字典>

【讨论】:

  • 谢谢,但 ILookup 接口似乎只能从 .NET 3.5 获得,我使用的是 .NET 2.0 ....
【解决方案2】:

因为具有相同键类型的多个值否定了字典的实用性,所以 KeyValuePairs 列表通常更有意义:

List<KeyValuePair<string, string>> itemTable = new List<KeyValuePair<string, string>>();

【讨论】:

    【解决方案3】:

    您可以使用Dictionary&lt;yourKeyType, List&lt;yourObjectType&gt;&gt;. 就像您可以为每个密钥添加多个项目...在添加之前检查您的密钥是否已经存在列表 --> 添加它,否则创建一个新列表。将它包装在一个内部处理它的类中更优雅。

    您可以使用的类示例:

    class MultiValueDictionary<TKey, TValue>
    {
        private Dictionary<TKey, List<TValue>> _InternalDict = new Dictionary<TKey, List<TValue>>();
    
        public void Add(TKey key, TValue value)
        {
            if (this._InternalDict.ContainsKey(key))
                this._InternalDict[key].Add(value);
            else
                this._InternalDict.Add(key, new List<TValue>(new TValue[]{value}));
        }
    
        public List<TValue> GetValues(TKey key)
        {
            if (this._InternalDict.ContainsKey(key))
                return this._InternalDict[key];
            else
                return null;
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      只需生成一个伪密钥...

      int emptyKey = 0;
      
      ...
      if (!String.IsNullOrEmpty(navChildren.Value))
      {
         string key = "Empty_" + emptyKey.ToString();
         emptyKey ++;
         itemTable.Add(key, navChildren.Value);
         //Add blank keys
      }
      

      您仍将拥有值,但请注意字典不保留(添加的)顺序。

      【讨论】:

        【解决方案5】:

        尝试使用元组:

        http://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/

        更新

        好的,现在帖子说 .Net 2.0 所以......这个答案行不通!

        我认为这很有用:

        Dictionary w/ null key?

        【讨论】:

        • 我认为这不适用,他希望允许同一个键有多个条目,而不是每个条目有多个键
        • 帖子告诉他想使用字典字符串,有时为空键的字符串。我认为 Tuple 可以工作。
        • 看起来他是在我发布之后编辑的。我不太清楚他现在想要什么,你的回答很可能是相关的。
        【解决方案6】:

        虽然很冗长,但这可以工作:

        class Pair<A, B>
        {
            public A Key { get; set; }
            public B Value{ get; set; }
        }
        
        var items = new List<Pair<string, string>>();
        
        items.Add(new Pair<string,string>() { Key = "", Value = "Test" });
        items.Add(new Pair<string,string>() { Key = "", Value = "Test" });
        

        【讨论】:

          猜你喜欢
          • 2019-10-31
          • 1970-01-01
          • 2019-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-24
          • 2012-03-15
          • 1970-01-01
          相关资源
          最近更新 更多