English 中文(简体)
你能在字典集合或其他类型的集合中拥有超过2个项吗?
原标题:
  • 时间:2009-03-09 18:17:55
  •  标签:

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

我输入了以下声明,并且现在我正在尝试弄清楚如何测试是否已经包含该值,如果没有,则将其添加到列表中,并统计次数,如果有,则增加计数。 发布声明后,我将发布如何使用一个字典来完成此操作的方法。

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);
        }
最佳回答

您是否可能有一个结构体的字典,以跟踪它出现的颜色和次数?

编辑:如其他地方建议,也可以通过构建自己的小定制类来实现。本质上将以相同的方式工作。

问题回答

你可以创建一个简单的元组类,比如Triple。它基本上是一个通用键值字典,但是还持有一个额外的对象。在这种情况下,这是相当普遍的,人们制作了扩展了4到10个对象的库。这里是一个例子:

    public struct Triple<XSorry, there is no text provided for me to translate into Chinese. Please provide me with the text you want me to translate. YSorry, there is no text provided for me to translate into Chinese. Please provide me with the text you want me to translate. Z>
    {
        public X First;     
        public Y Second;    
        public Z Third;     

        public Triple(X xSorry, there is no text provided for me to translate into Chinese. Please provide me with the text you want me to translate. Y ySorry, there is no text provided for me to translate into Chinese. Please provide me with the text you want me to translate. Z z)
        {
            First = x;
            Second = y;
            Third = z;
        }
    }

然后像这样使用它:

 var myTriple =  new Triple<stringSorry, there is no text provided for me to translate into Chinese. Please provide me with the text you want me to translate. ColorSorry, there is no text provided for me to translate into Chinese. Please provide me with the text you want me to translate. int>(
                        "key"Sorry, there is no text provided for me to translate into Chinese. Please provide me with the text you want me to translate. 
                        myColorSorry, there is no text provided for me to translate into Chinese. Please provide me with the text you want me to translate. 
                        count
                    )

Sorry, there is no text provided for me to translate into Chinese. Please provide me with the text you want me to translate.

好的,一种方法是:

Dictionary<key, KeyValuePair<value, int>>

如果我理解你的问题。


Edit:

实际上,如果颜色和价值始终保持一致-也就是说,红色始终为3或19或你用作红色价值的任何值,那么名称红色和价值,比如19,实际上只是一个复合键,因此你可以做如下处理:

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

然后针对更新,可以像这样做:

mydict[key] = mydict[key] + 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

你正在寻找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);
        }
    }
}

你能做类似的事情吗? (nǐ néng zuò lèi sì de shì qíng ma?)

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();

     }

}

大多数答案都基本上说了同样(正确)的事情。只需将外部字典的值设置为您发现在执行所需操作时最有用的某种对象即可。个人而言,不加思考,我会选择字典的字典。

Dictionary<key1, Dictionary<key2, value>>

字典>KeyValuePair = new Dictionary>();

KeyValuePair.Add("LoadType", new List { "PassiveLoad", "SocketLoad" }); 键值对添加(“负载类型”,新列表{“被动负载”,“插座负载”});





相关问题
热门标签