你可以在Dictionary集合或其他类型的集合中拥有2个以上的项目吗?

时间:2009-03-09 18:17:55

标签: c# collections

我怀疑这是可能的,但我很好奇你是否可以在字典中有超过2项(键,值)。也许一个关键和2个值。是否有一个允许这个的集合对象?我实际上要做的是存储键的键和值以及另一个值来保存键的找到次数。例如,我可能有一个遍历颜色列表的for循环,每种颜色都有一个唯一值。当我查看列表时,我不仅要将颜色,颜色的唯一值存储在字典中,还要存储列表中出现红色的次数。

我输入了以下声明,现在我想弄清楚如何测试它是否已包含值,如果没有,请将其添加到计数为1的列表中,如果是,递增计数。在我发布声明之后,我将用一个词典发布我是如何做到的。

Dictionary<string, Dictionary<int,int>> colors = 
                          new Dictionary<string, Dictionary<int,int>>();

以下是我之前处理它的代码:

Dictionary<string, int> colors = new Dictionary<string, int>();

 foreach (Color color in ColorList)
        {
            if (colors.ContainsKey(color.ToString()))
                colors[color]++;
            else
                colors.Add(color, 1);
        }

8 个答案:

答案 0 :(得分:7)

你可以创建一个简单的Tuple类,比如Triple。它本质上是一个通用键控字典,但包含一个额外的对象。这种情况非常普遍,人们已经制作了库,可以将其扩展到4到10个对象。这是一个例子:

    public struct Triple<X, Y, Z>
    {
        public X First;     
        public Y Second;    
        public Z Third;     

        public Triple(X x, Y y, Z z)
        {
            First = x;
            Second = y;
            Third = z;
        }
    }

然后像这样使用它:

 var myTriple =  new Triple<string, Color, int>(
                        "key", 
                        myColor, 
                        count
                    )

答案 1 :(得分:4)

你是否可以拥有一个结构字典来跟踪颜色及其发生的次数?

编辑:正如其他地方所建议的,这也可以通过构建自己的小型自定义类来实现。基本上会以同样的方式工作。

答案 2 :(得分:3)

您可以为此使用两个词典,或者只是创建一个同时具有颜色和计数的数据类,并将中间类实例存储在字典中。

答案 3 :(得分:2)

嗯,一种方法是:

Dictionary<key, KeyValuePair<value, int>>

如果我理解你的问题。

<小时/> 编辑:

实际上,如果颜色和值是一致的 - 意味着'红色'总是3或19或者你用作红色值的任何东西,那么名称'red'和值,比如19,实际上只是一个复合键,所以你可以做这样的事情:

Dictionary<KeyValuePair<string, int>, int> mydict;

然后更新做类似的事情:

mydict[key] = mydict[key] + 1;

答案 4 :(得分:1)

由于C#4.0有 Tuple 类,它提供了用于创建元组对象的静态方法。

请参阅:http://msdn.microsoft.com/en-us/library/system.tuple.aspx

// Create a 7-tuple. 
var population = new Tuple<string, int, int, int, int, int, int>(
                           "New York", 7891957, 7781984, 
                           7894862, 7071639, 7322564, 8008278);
// Display the first and last elements.
Console.WriteLine("Population of {0} in 2000: {1:N0}",
                  population.Item1, population.Item7);
// The example displays the following output: 
//       Population of New York in 2000: 8,008,278 
//       Population of New York in 2000: 8,008,278

答案 5 :(得分:0)

您正在寻找MultiMap。

我写了以下内容(未经过全面测试):

 using System.Collections.Generic;

public class MultiMapSet<TKey, TValue>
{
    private readonly Dictionary<TKey, HashSet<TValue>> _ht = new Dictionary<TKey, HashSet<TValue>>();

    public void Add(TKey key, TValue value)
    {
        HashSet<TValue> valueSet;
        if (_ht.TryGetValue(key, out valueSet))
        {
            valueSet.Add(value);
        }
        else
        {
            valueSet = new HashSet<TValue> { value };
            _ht.Add(key, valueSet);
        }
    }

    public bool HasValue(TKey key, TValue value)
    {
        HashSet<TValue> valueSet;
        if (_ht.TryGetValue(key, out valueSet))
        {
            return valueSet.Contains(value);
        }
        return false;
    }

    public HashSet<TValue> GetValues(TKey key)
    {
        HashSet<TValue> valueSet;
        _ht.TryGetValue(key, out valueSet);
        return valueSet;
    }

    public void Remove(TKey key, TValue value)
    {
        HashSet<TValue> valueSet;
        if (!_ht.TryGetValue(key, out valueSet))
        {
            return;
        }

        if (valueSet.Contains(value))
        {
            valueSet.Remove(value);
        }
    }
}

答案 6 :(得分:0)

这些答案中的大多数都说的几乎相同(正确)。只需将“外部”字典的值设置为某些对象,您认为这些对象可以满足您的需求。就个人而言,我没有想过它,我已经附上了字典词典。

Dictionary<key1, Dictionary<key2, value>>

答案 7 :(得分:-1)

你能做点什么吗

Dictonary<string,string> dh = new dictonary<string,string>();

dh.add("x","Something:0");


foreach keyvaluepair kvp in dh
{

    if kvp.key == x
    {
        string[] hold= kvp.value.split(':');
        //to update it the count it would be something like

        int y = convert.toint(hold[1])+1;
        kvp.value=hold[0]+":"+y.tostring();

     }

}