为了优化我的代码,我正在尝试创建我自己Indexer
和我自己的FindEntry
函数版本 - 这样我就可以在Dictionary
-like 类中执行以下操作:
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];
但这不起作用......实际上能够使用任何一种语法都是最理想的。