辞書を使用するには、キーが等価演算をサポートしている必要があります。例えば:
public class ICD_Map2 : IEquatable<ICD_Map2>
{
public ICD_Map2(string callType, string destination) {
CallType = callType;
Destination = destination;
}
public override int GetHashCode() {
int result = 17;
result = -13 * result +
(CallType == null ? 0 : CallType.GetHashCode());
result = -13 * result +
(Destination == null ? 0 : Destination.GetHashCode());
return result;
}
public override bool Equals(object other) {
return Equals(other as ICD_Map2);
}
public bool Equals(ICD_Map2 other) {
if(other == null) return false;
if(other == this) return true;
return CallType == other.CallType && Destination == other.Destination;
}
public string CallType {get; private set; }
public string Destination{get; private set;}
}
読み取り専用にすることは意図的なものであることに注意してください。可変キーは大きな問題を引き起こす可能性があります。それは避けてください。
これで、これをキーとして使用できます。次に例を示します。
var key = new ICD_Map2("Mobile SMS", "Australia");
string result;
if(maps.TryGetValue(key, out result)) {
Console.WriteLine("found: " + result);
}
逆引き参照には問題があり、2番目の辞書がないと最適化できません。簡単な操作(パフォーマンスO(n))は次のようになります。
string result = "International Text";
var key = (from pair in maps
where pair.Value == result
select pair.Key).FirstOrDefault();
if(key != null) {
Console.WriteLine("found: " + key);
}
すべてを一緒に入れて:
static void Main()
{
Dictionary<ICD_Map2, string> maps = new Dictionary<ICD_Map2, string> {
{new ICD_Map2 ("Mobile SMS", "Australia"),"Local Text"},
{new ICD_Map2 ("Mobile SMS", "International"),"International Text"}
};
// try forwards lookup
var key = new ICD_Map2("Mobile SMS", "Australia");
string result;
if (maps.TryGetValue(key, out result))
{
Console.WriteLine("found: " + result);
}
// try reverse lookup (less efficient)
result = "International Text";
key = (from pair in maps
where pair.Value == result
select pair.Key).FirstOrDefault();
if (key != null)
{
Console.WriteLine("found: " + key);
}
}