Использование Enum и |в качестве словарного ключа - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь использовать словарь с типом enum в качестве ключа и строкой в ​​качестве его значения.

Вот мое перечисление:

public enum MilitaryBranch{
    AirForce,
    Army,
    Navy,
    Marines,
    Coastguard
}

А вот мой словарь

Dictionary<MilitaryBranch, string> BranchToRankMapping = new Dictionary<MilitaryBranch, string>()
{
    {    MilitaryBranch.AirForce|MilitaryBranch.Army|MilitaryBranch.Marines, "General" },
    {    MilitaryBranch.Navy, "Admiral" },
    {    MilitaryBranch.Coastguard, "Commandant" },
}

В словаре я пытался использовать |оператор OR AirForce, Army и Marines вместе, так что если бы любое из этих перечислений было предоставлено в качестве Ключа к словарю, оно вернуло бы «General».

Вот мое использование словаря и перечисления:

public void Test(){
    string af = BranchToRankMapping[MilitaryBranch.AirForce];
    string army = BranchToRankMapping[MilitaryBranch.Army];
    string marines = BranchToRankMapping[MilitaryBranch.Marines];
    string navy = BranchToRankMapping[MilitaryBranch.Navy];
    string cg= BranchToRankMapping[MilitaryBranch.Coastguard];
}

При попытке получить значение словаря для MilitaryBranch.AirForce, .Army и .Marines я получаю исключение Ключ не найден.

Это то, что я пытаюсь сделать невозможный?Нужно ли вводить элемент словаря для каждого значения перечисления?Спасибо

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Да, запись для каждого.

Dictionary<MilitaryBranch, string> BranchToRankMapping = new Dictionary<MilitaryBranch, string>()
{
    {    MilitaryBranch.AirForce, "General" },
    {    MilitaryBranch.Army, "General" },
    {    MilitaryBranch.Marines, "General" },
    {    MilitaryBranch.Navy, "Admiral" },
    {    MilitaryBranch.Coastguard, "Commandant" },
}
0 голосов
/ 16 октября 2018

По MilitaryBranch.AirForce|MilitaryBranch.Army|MilitaryBranch.Marines вы делаете bitwise OR, что приводит к 3, что эквивалентно MilitaryBranch.Marines в вашем случае.

Следовательно, вы получите значение для BranchToRankMapping[MilitaryBranch.Marines], а не для BranchToRankMapping[MilitaryBranch.AirForce] или BranchToRankMapping[MilitaryBranch.Army].

Так что да, нам нужно иметь запись для каждого значения в вашем перечислении.

0 голосов
/ 16 октября 2018

Если не указано иное, перечисление отображается в целое значение.Поиск в словаре будет основан на целочисленном значении перечисляемого значения.

Поскольку вы не переопределяете значения, присвоенные вашему перечислению, они нумеруются.Это означает, что AirForce == 0, Army == 1 и т. Д.

Когда вы объединяете AirForce | Army | Marines, вы действительно делаете 0 | 1 | 3, что составляет 3.

ПутьВы настроили свой словарь, вы добавили записи для целых значений 3 (с побитовым операндом), 2 (для военно-морского флота) и 4 (для морской пехоты).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...