繁体   English   中英

我应该将哪种类类型用于通过键更新和值查找进行排序的集合

[英]Which class type should I use for sorted collection with key updating and value lookup

我正在用C#代码在Unity中制作游戏,并且我希望角色具有类似Aggro Table之类的东西。

它将是类似(float,int)的表 ,其中int是其他字符ID, float是实际的农业价值。

基本上,我没有几件事:

  • 该表应按浮点键排序,这样我就可以快速获取顶部条目
  • 由于(3),我需要能够按其int值频繁查找条目
  • 我想经常更改浮动键,并一直对表进行排序
  • 关心的内存使用并且不会有很多条目
  • 确实关心插入/删除/更改条目以及对列表进行重新排序等操作的性能

我对C#的经验不是很丰富,很少看到诸如sortedlist / dictionary之类的东西,但是它似乎并没有针对我想要的所有东西进行优化。

您有什么建议吗?

编辑:不确定我是否在解释我要实现的目标方面做得很好。 它可能非常类似于足球运动员的名字和赛季中进球数的表格。 我会经常要求“最有生产力的球员”,而且我会经常通过查找他们的名字并更改其统计信息来更新他们的得分,这需要始终对表格进行排序。

您可以使用List<Character>或不包含玩家角色的数组。 您可以使List<Character>始终以最高的农业价值排在最前面。 为了使所有帧都排序,首先要运行quicksort 一旦Character异能值低于玩家的异能阈值,您就可以退出该方法。

如果aggro高于阈值,则运行aggro检查。

您可以通过拥有List<Player>将其扩展为适用于多人游戏。 就像是:

void quicksort(List<Enemy> enemies, int first, int last)
{
   int left = first;
   int right = last;
   int pivot = first;
   first++;

   while (last >= first)
   {
       if(enemies[first].Aggro >= enemies[pivot].Aggro &&
           enemies[last].Aggro < enemies[pivot].Aggro)
           swapp(enemies, first, last)
       else if(enemies[first].Aggro >= enemies[pivot].Aggro)
         last--;
       else if(enemies[last].Aggro < colliders[pivot].Aggro)
         first++;
       else
       {
            last--;
            first++;
       }
   }

   swap(enemies, pivot, last);
   pivot = last;
   if(pivot > left)
      quicksort(enemies, left, pivot);
   if(right > pivot + 1)
     quicksort(enemies, pivot + 1, right);
}

void swap(List<Enemy> enemies, int left, right)
{
   var temp = enemies[right];
   enemies[right] = enemies[left];
   enemies[left] = temp;
}

void CheckAggro()
{
   quicksort(enemies, 0, enemies.Count - 1);
   for(int = 0; i < players.Count; i++)
   {
       for(int j = 0 < enemies.Count; j++)
       {
           if(players[i].AggroThreshhold < enemies[j].Aggro)
           {
                break;
           }
           // Perform what happens when enemy is high on aggro threshold.
       }
   }
}

如果玩家具有不同的aggro阈值,则可以将所有aggro大于最小值的敌人保存到单独的List ,然后从最低阈值到最高阈值的玩家进行检查。 只需让玩家列表中排在前列的最低Aggro门槛就可以。

我认为最好的解决方案在SortedList 从我可以收集到的信息来看: SortedList <TKey, TValue>在排序日期时具有更快的插入和删除操作。

我认为有一个问题会有所帮助: 什么时候在SortedDictionary <TKey,TValue>上使用SortedList <TKey,TValue>?

希望我能帮上忙。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM