コードを最適化するために、関数Indexer
の独自のバージョンと独自のバージョンを作成しようとしています。これにより、 -likeクラス内で次のようなことができるようになります。FindEntry
Dictionary
object IDictionary.this[int key] {
get {
int num = this.FindEntry(key);
if (num >= 0) {
return this.entries[num].value;
}
return null;
}
set {
Dictionary<TKey, TValue>.VerifyValueType(value);
this [key] = (TValue)((object)value);
}
}
private int FindEntry (int key) {
if (this.buckets != null) {
int num = key & 2147483647;
for (int i = this.buckets[num % this.buckets.Length]; i >= 0; i = this.entries[i].next) {
if (this.entries[i].hashCode == num && this.comparer.Equals(this.entries[i].key, key)) {
return i;
}
}
}
return -1;
}
辞書のキーは構造体であるため、これは便利ですが、キーではなくハッシュコードを使用する場合があります。
からの書き換え以外の解決策を探していますが、その中の変数はプライベートであるため、それが唯一の方法である可能性があります。Dictionary<TKey, TValue>
System
entries
以下は、私が達成しようとしていることを示すのに役立つ、私のコードの基本的な例です。
struct SuperKey : IEquatable<SuperKey> {
public int Id;
public int Environment;
public override int GetHashCode() {
return this.Id;
}
public override bool Equals(object other) {
return other is SuperKey ? Equals((SuperKey)other) : false;
}
public bool Equals(SuperKey other) {
return this.Id == other.Id && this.Environment == other.Environment;
}
}
と
class Example {
Dictionary<SuperKey, Player> players;
void MyFunction() {
SuperKey sk = new SuperKey(36, 1);
Player p1 = new Player();
players.Add(sk, p1);
}
void ReceiveEventForPlayer(int id, PlayerEventName name) {
ReceiveEventForPlayer(id, 0, name);
}
void ReceiveEventForPlayer(int id, int environment, PlayerEventName name) {
Player p = players[new SuperKey(id, 1)];
}
}
このすぐ上のReceiveEventForPlayer
方法では、次の行に注意してください。
Player p = players[new SuperKey(id, 1)];
私は使用できるようにしたいと思います:
Player p = players[id];
しかし、これは機能しません...どちらの構文も使用できることが実際には最も理想的です。