Есть ли способ связать два значения данных, проще, чем словарь? - PullRequest
4 голосов
/ 28 февраля 2020

Я работаю над игрой с Unity, в которой у игрока есть несколько заклинаний. У меня есть перечисление, которое содержит все это, и я хочу присвоить им значение bool. Я думаю, что могу использовать System.Collections.Generics.Dictionary с Spell s как Key s и Boolean как Value, но есть ли более простой способ , чтобы сделать такую ​​вещь?

Ответы [ 4 ]

3 голосов
/ 28 февраля 2020

Вы можете упростить Dictionary<Spell, bool> hasSpell до HashSet<Spell> (вы хотите только Key, а не Value из исходного словаря):

  public enum Spell { 
    Fireball,
    Levitate,
    Resurrect,   
  };

  ...

  HashSet<Spell> abilities = new HashSet<Spell>() { 
    Spell.Fireball, 
    Fireball.Levitate,
  };

  ...

  // If the hero can resurrect...
  if (abilities.Contains(Spell.Resurrect)) {
    // ...let him raises from the dead
  }
0 голосов
/ 05 марта 2020

Вы можете использовать одно битовое значение, задав флаги перечисления, если у вас ограниченное количество заклинаний.

[Flags]
public enum Spell : long
{
    Firebolt = (1 << 0),
    Rage = (1 << 1),
    Flash = (1 << 2),
};
0 голосов
/ 05 марта 2020

(это еще один подход к упрощению)

Да, словари - это простые коллекции, но это не совсем то, что я ожидаю. Я хочу что-то сказать: «Это значение из перечисления истинно, это ложно»

Это звучит так, что вам нужен хороший класс, который инкапсулирует менее простую или более низкоуровневую структуру (например, словарь или хэшсет). Это будет легко с внешней стороны / API-isde.

Например:

public enum Spell
{
    Firebolt,
    Rage,
    Flash,
};


public class SpellState
{
    private HashSet<Spell> _enabled = new HashSet<Spell>();

    public void EnableSpell(Spell spell)
    {
        _enabled.Add(spell);
    }

    public void DisableSpell(Spell spell)
    {
         _enabled.Remove(spell);
    }

    public bool IsSpellEnabled(Spell spell)
    {
        return _enabled.Contains(spell);
    }
}

Использование

var spellState = new SpellState();

spellState.EnableSpell(Spell.Rage);

// later
if (spellState.IsSpellEnabled(Spell.Flash))
{
    spellState.DisableSpell(Spell.Rage);
    // todo
}
0 голосов
/ 28 февраля 2020

Индивидуально самый простой способ связывания двух значений данных - использовать кортеж значений. Эту функцию можно использовать в любой версии Unity начиная с 2018.3 и далее, поскольку именно тогда она перестала использовать устаревшие C# версии.

var spell = ("Fireball", true);

Если вы предпочитаете более четко указывать типы:

(string, bool) spell = ("Fireball", true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...