检查字典密钥包含

时间:2012-12-06 12:19:05

标签: c# key contains

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

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 个答案:

答案 0 :(得分:4)

比两次调用ContainsKey和三个字典索引的效率稍高一些:

Dictionary<int, int> forGroup;
if (dicThreatPurgeSummary.TryGetValue(Group, out forGroup) &&
    forGroup.ContainsKey(Month))
{
    forGroup[Month] = newValue;
}

答案 1 :(得分:3)

这应该有效

if(dicThreatPurgeSummary.ContainsKey(Group) &&
   dicThreatPurgeSummary[Group].ContainsKey(Month))
{
    dicThreatPurgeSummary[Group][Month] = NewValue;
}

答案 2 :(得分:0)

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

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

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

您可以使用tuple

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))
{
    // ...

}

答案 3 :(得分: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
}