我正在写一个7卡扑克手评估员作为我的宠物项目之一.在尝试优化速度时(我喜欢挑战),我惊讶地发现,与数组索引查找相比,Dictionary键查找的性能相当慢.
例如,我运行了这个示例代码,列举了所有52个选择7 = 133,784,560个可能的7个牌手:
var intDict = new Dictionary<int, int>();
var intList = new List<int>();
for (int i = 0; i < 100000; i ++)
{
    intDict.Add(i, i);  
    intList.Add(i);
}
int result;
var sw = new Stopwatch();
sw.Start();
for (int card1 = 0; card1 < 46; card1++)
  for (int card2 = card1 + 1; card2 < 47; card2++)
    for (int card3 = card2 + 1; card3 < 48; card3++)
      for (int card4 = card3 + 1; card4 < 49; card4++) …我正在尝试模拟涉及人员和座位的基本场景.人具有身份属性:坐着或站立.一个席位有一个Seated属性,用于指定当前位于其中的Person.此外,座位特别之处在于它只"接受"某些人坐在其中.我知道座位"接受"某人听起来很奇怪,但只是想象它更喜欢某些人而不是其他人.
在" 告诉,不要问 "之后,我应该如何设计Person和Seat对象,以便只有当Seat"接受"他并且他的状态改为Sitting时,Person才能坐在座位上.我的第一个想法是一个Person应该有一个SitDown方法如下:
Person.SitDown(Seat seat);
但这似乎需要Person类在坐在其中之前检查Seat的状态,以及必须更新Seat的Seated属性(而不是更新属性本身的Seat):
// inside the Person class
void SitDown(Seat seat) {
    if (seat.AcceptsPlayer(this)) {
        seat.Seated = this;
        this.Status = Sitting;
    }
}
让Seat类处理一个人似乎更好:
Seat.SeatPerson(Person person);
// inside Seat class
void SeatPerson(Person person) {
    if (IsAccepted(person)) {
        this.Seated = person;
        person.Status = Sitting;
    }
}
但这仍然要求座位改变此人的身份.这是该人的状态应该更新的方式吗?只有一个人能够改变他的身份吗?你会如何模拟这个简单的场景?