1

我必须在字典中存储两个键一个值。所以我这样使用。

Dictionary<int, Dictionary<int, int>> dicThreatPurgeSummary = new Dictionary<int,Dictionary<int,int>>();

我添加了键、键和值。

Dictionary<int, int> innerdict = new Dictionary<int,int>();
innerdict.Add(Month, Count);
dicThreatPurgeSummary.Add(Group, innerdict);

我能够像这样查看价值

int a = dicThreatPurgeSummary[Group][Month];

如果 dicThreatPurgeSummary[Group][Month] 已经存在,我需要更新它的值。请帮我找出这个。

4

4 回答 4

4

比两次调用ContainsKey和三个字典索引更有效:

Dictionary<int, int> forGroup;
if (dicThreatPurgeSummary.TryGetValue(Group, out forGroup) &&
    forGroup.ContainsKey(Month))
{
    forGroup[Month] = newValue;
}
于 2012-12-06T12:34:30.627 回答
3

这应该工作

if(dicThreatPurgeSummary.ContainsKey(Group) &&
   dicThreatPurgeSummary[Group].ContainsKey(Month))
{
    dicThreatPurgeSummary[Group][Month] = NewValue;
}
于 2012-12-06T12:27:01.037 回答
0

您可以使用Dictionary<>.ContainsKey来检查密钥是否存在,因此您可以这样做:

if (dicThreatPurgeSummary.ContainsKey(Group))
{
    if (dicThreatPurgeSummary[Group].ContainsKey(Month))
    {
        // dicThreatPurgeSummary[Group][Month] exists
    }
}

请注意,使用二维而不是级联两个字典可能会更好。这样,您无需在每次为第一级使用新键时都添加新字典,并且所有值都在同一个字典中,从而允许您迭代值或检查值是否存在。

您可以为此使用元组

var dicThreatPurgeSummary = new Dictionary<Tuple<int, int>, int>();
dicThreatPurgeSummary.Add(new Tuple<int, int>(Group, Month), Count);

// accessing the value
int a = dicThreatPurgeSummary[new Tuple<int, int>(Group, Month)];

// checking for existance
if (dicThreatPurgeSummary.ContainsKey(new Tuple<int, int>(Group, Month)))
{
    // ...
}

使用更漂亮的子类型

(未经测试)

class IntIntDict<T> : Dictionary<Tuple<int, int>, T>
{
    public T this[int index1, int index2]
    { get { return this[new Tuple(index1, index2)]; } }

    public bool ContainsKey (int index1, int index2)
    {
        return ContainsKey(new Tuple(index1, index2));
    }

    public void Add (int index1, int index2, T value)
    {
         Add(new Tuple(index1, index2), value);
    }
    // ...
}

然后你可以像这样使用它:

var dicThreatPurgeSummary = new IntIntDict<int>();
dicThreatPurgeSummary.Add(Group, Month, Count);

// accessing the value
int a = dicThreatPurgeSummary[Group, Month];

// checking for existance
if (dicThreatPurgeSummary.ContainsKey(Group, Month))
{
    // ...

}

于 2012-12-06T12:27:14.070 回答
0
Dictionary<int, int> innerDic = null;
bool isGroupPresent = dicThreatPurgeSummary.TryGetValue(Group, out innerDic);
if(isGroupPresent == false)
{
    //No entry for Group.
}
else
{
    int count;
    bool isMonthPresent = innerDic.TryGetValue(Month, out count);
    //Same as above
}
于 2012-12-06T12:28:28.837 回答