辞書のキーとしてKeyValuePairを使用する:
KeyValuePairを辞書のキーとして使用することは機能的に機能します。ただし、2つのint間のキーと値の関係を意味するため、概念的にはアプリケーションにとっておそらく最良の選択ではありません。
代わりに、マイクが提案するように、キーにはタプルを使用する必要があります。
2番目の質問の場合:
var myDictionary = new Dictionary<KeyValuePair<int,int>, string>();
myDictionary.Add(new KeyValuePair<int,int>(3, 3), "FirstItem");
myDictionary.Add(new KeyValuePair<int,int>(3, 3), "SecondItem");
// does the dictionary allow this?
ディクショナリはこれを許可しません。ディクショナリ自体は、キーが一意である必要があるキーと値のペアのセットです。複数の値を同じキーにマップできるようにする場合、1つのオプションは、値を別のコレクションにすることです。
var myDictionary = new Dictionary<KeyValuePair<int,int>, List<string>>();
ただし、例のようにmyDictionary.Addを使用することはできません。代わりに、キーが辞書の一部であるかどうかを判断し、それに応じて動作するための追加機能を提供する必要があります。
public static class DictionaryHelper
{
public static void Add(this Dictionary<Tuple<int,int>, List<string>> dict,Tuple<int,int> key, string value)
{
if(dict.ContainsKey(key))
{
dict[key].Add(value);
}
else
{
dict.Add(key, new List<string>{value});
}
}
}