我应该使用哪种类类型进行带有键更新和值查找的排序集合

时间:2016-09-24 23:47:42

标签: c# sorting unity3d collections

我正在使用c#代码在Unity中制作一个游戏,我希望角色有像aggro table这样的东西。

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

基本上,我的想法很少:

  • 表格应按浮动键排序,这样我就可以快速登顶 条目
  • 我需要能够经常通过int查找条目 值因为(3)
  • 我想经常更换浮动键并拥有 该表一直排序
  • 关心内存使用情况 因为那里不会有那么多条目
  • 关心的表现 插入/删除/更改条目和重新排序等操作 清单

我在C#中没有很多经验,看过像sortedlist / dictionary这样的东西,但它似乎没有针对我想要的所有东西进行优化。

你有什么建议吗?

编辑:不确定我是否做了很好的解释我想要实现的目标。这可能非常类似于足球运动员名单和他们在赛季中得分的目标数量。我会经常要求“效率最高的玩家”,并且我会经常通过查找他们的名字和更改他们的统计数据来更新他们的分数,需要一直对表格进行分类。

2 个答案:

答案 0 :(得分:2)

你可以使用List<Character>或不包括玩家角色的数组。保持List<Character>排序,前面有最高的aggro值。要保持每个帧的所有内容排序,请先运行quicksort。一旦Character具有比玩家的仇恨阈值更低的仇恨值,你就逃脱了该方法。

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

您可以通过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.
       }
   }
}

如果玩家具有不同的仇恨阈值,您可以将具有超过最小值的仇恨的所有敌人保存到单独的List,然后对具有最低到最高阈值的玩家进行检查。只需先保存以最低仇恨阈值排序的玩家列表。

答案 1 :(得分:0)

我认为SortedList中的最佳解决方案。从我能收集的内容: SortedList <TKey, TValue>在排序日期时具有更快的插入和删除操作。

我认为有一个问题会有所帮助:When to use a SortedList<TKey, TValue> over a SortedDictionary<TKey, TValue>?

希望我帮忙。