Collections Data Structure C#

//http://isotopescreencapture.codeplex.com/
//The MIT License (MIT)
using System.Collections.Generic;
namespace Isotope.Collections
{
    public class TwoKeyDictionary
    {
        Dictionary> dic_pk;
        public TwoKeyDictionary()
        {
            this.dic_pk = new Dictionary>();
        }
        public bool ContainsPrimaryKey(PK pk)
        {
            return this.dic_pk.ContainsKey(pk);
        }
        public bool ContainsKey(PK pk, SK sk)
        {
            V v;
            bool haskey = this.TryGetValue(pk, sk, out v);
            return haskey;
        }
        public bool TryGetValue(PK pk, SK sk, out V v)
        {
            Dictionary sk_dic;
            bool has_pk = this.dic_pk.TryGetValue(pk, out sk_dic);
            if (!has_pk)
            {
                v = default(V);
                return false;
            }
            return sk_dic.TryGetValue(sk, out v);
        }
        public V GetValue(PK pk, SK sk)
        {
            V v;
            bool haskey = this.TryGetValue(pk, sk, out v);
            if (!haskey)
            {
                string msg = string.Format("(pk,sk) missing");
                throw new KeyNotFoundException(msg);
            }
            return v;
        }
        public void SetValue(PK pk, SK sk, V v)
        {
            Dictionary sk_dic;
            bool has_pk = this.dic_pk.TryGetValue(pk, out sk_dic);
            if (!has_pk)
            {
                sk_dic = new Dictionary();
                this.dic_pk[pk] = sk_dic;
            }
            sk_dic[sk] = v;
        }
        public V this[PK pk, SK sk]
        {
            get
            {
                return this.GetValue(pk, sk);
            }
            set
            {
                this.SetValue(pk, sk, value);
            }
        }
        public int Count
        {
            get
            {
                int n = 0;
                foreach (var i in this.dic_pk.Values)
                {
                    n += i.Count;
                }
                return n;
            }
        }
    }
}