没有唯一键的字典

时间:2011-06-10 11:05:02

标签: c# .net generics

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

 this key already exists.

还有其他课吗?

另外,我正在使用.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
...

6 个答案:

答案 0 :(得分:6)

你可以实现ILookup接口......

包装词典< TKEY的,列表与LT; TValue> >

答案 1 :(得分:3)

你可以使用Dictionary<yourKeyType, List<yourObjectType>>.就像你可以为每个键添加多个项目...在添加之前,检查你的密钥是否已经存在 - &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;
    }

}

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

只需生成一个伪键......

int emptyKey = 0;

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

你仍然会有值,但请注意,词典不保留顺序(添加)。

答案 4 :(得分:1)

尝试使用Tuple:

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

<强>更新

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

我认为这很有用:

Dictionary w/ null key?

答案 5 :(得分:1)

虽然非常详细,但这可行:

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" });