Есть ли способ enumare через Enum для создания массива? - PullRequest
0 голосов
/ 06 октября 2018

У меня есть этот код, который строка за строкой создает массив:

vm.CardChoice = new[] {
        new ParamViewModel { Id = 0,  Name = CC.JLPT5.Text() },
        new ParamViewModel { Id = 1,  Name = CC.JLPT4.Text() },
        new ParamViewModel { Id = 2,  Name = CC.JLPT3.Text() },
        new ParamViewModel { Id = 3,  Name = CC.JLPT2.Text() },
        new ParamViewModel { Id = 4,  Name = CC.JLPT1.Text() },
        new ParamViewModel { Id = 5,  Name = CC.JFBP1.Text() },
        new ParamViewModel { Id = 5,  Name = CC.JFBP2.Text() },
        new ParamViewModel { Id = 7,  Name = CC.JFBP3.Text() },
        new ParamViewModel { Id = 8,  Name = CC.All.Text()   },
        new ParamViewModel { Id = 9,  Name = CC.Catg.Text()  },
        new ParamViewModel { Id = 10, Name = CC.Cat.Text()   },
        new ParamViewModel { Id = 11, Name = CC.C1.Text()    },
        new ParamViewModel { Id = 12, Name = CC.C2.Text()    },
        new ParamViewModel { Id = 13, Name = CC.C3.Text()    },
        };

Есть ли способ, которым я мог бы сделать это на основе самого ENUM, или это единственный способ кодировать его построчно?Вот ENUM, который у меня есть:

using System;
namespace Japanese.Enums
{
    public enum CC
    {
        JLPT5 = 0,
        JLPT4 = 1,
        JLPT3 = 2,
        JLPT2 = 3,
        JLPT1 = 4,
        JFBP1 = 5,
        JFBP2 = 6,
        JFBP3 = 7,
        All = 8,
        Catg = 9,
        Cat = 10,
        C1 = 11,
        C2 = 12,
        C3 = 13
    }

    public static partial class Extensions
    {
        public static string Text(this CC cardChoice)
        {
            switch (cardChoice)
            {
                case CC.JLPT5: return "N5";
                case CC.JLPT4: return "N4";
                case CC.JLPT3: return "N3";
                case CC.JLPT2: return "N2";
                case CC.JLPT1: return "N1";
                case CC.JFBP1: return "JFBP1";
                case CC.JFBP2: return "JFBP2";
                case CC.JFBP3: return "JFBP3";
                case CC.All: return "ALL";
                case CC.Catg: return "GROUP";
                case CC.Cat: return "> GROUP";
                case CC.C1: return "C1";
                case CC.C2: return "C2";
                case CC.C3: return "C4";
            }
            return "";
        }

        public static string LongText(this CC cardChoice)
        {
            switch (cardChoice)
            {
                case CC.JLPT5: return "Japanese Language Proficiency Test Level N5";
                case CC.JLPT4: return "Japanese Language Proficiency Test Level N4";
                case CC.JLPT3: return "Japanese Language Proficiency Test Level N3";
                case CC.JLPT2: return "Japanese Language Proficiency Test Level N2";
                case CC.JLPT1: return "Japanese Language Proficiency Test Level N1";
                case CC.JFBP1: return "Japanese for Busy People 1";
                case CC.JFBP2: return "Japanese for Busy People 2";
                case CC.JFBP3: return "Japanese for Busy People 3";
                case CC.All: return "All Available Words";
                case CC.Catg: return "High Level Group";
                case CC.Cat: return "Low Level Group";
                case CC.C1: return "Custom 1";
                case CC.C2: return "Custom 2";
                case CC.C3: return "Custom 3";

            }
            return "";
        }
    }
}

Ответы [ 2 ]

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

Проверьте класс System.Enum.У него есть много полезных методов, таких как GetNames или GetValues, которые позволяют читать все записи типа enum.В сочетании с некоторыми LINQ действительно просто обрабатывать их полуавтоматически.

Получив список записей enum, вы можете просто привести их к int, чтобы получить числовое значение, или использовать Enum.GetName или .ToString, чтобы получить их имена.

Возможно, вы также захотите проверить в этой статье некоторые подсказки, не относящиеся к LINQ, что вы можете делать с методами System.Enum.xxx.

https://blogs.msdn.microsoft.com/haibo_luo/2005/08/28/get-names-and-values-of-enum-members/

Однако это поможет вам только в извлечении данных, которые непосредственно описывают тип enum.Это означает, что CC.JLPT3 -> (int) 2 или CC.JLPT3 -> (строка) "JLPT3".Именно это потому, что определение enum содержит только данные такого типа, и в enum нет ничего более, что можно было бы прочитать.

Нет готовой магии, котораяавтоматически переведет

CC.JLPT3 is a string "N3"

или

CC.JLPT3 is a string "Japanese Language Proficiency Test Level N3"

Это пользовательские презентационные данные, совершенно не связанные с самим перечислением.

Чтобы получить какое-то волшебство, котороеупростит управление ими, вероятно, лучше всего поместить их в словарь для удобства чтения / использования / обновления. Или атрибутов в перечислении для повторного использования и простоты кодирования:

public enum CC
{
    [ShortText("N5")]
    [LongText("Japanese Language Proficiency Test Level N5")]
    JLPT5 = 0,

    [ShortText("N4")]
    [LongText("Japanese Language Proficiency Test Level N4")]
    JLPT4 = 1,

    [ShortText("N3")]
    [LongText("Japanese Language Proficiency Test Level N3")]
    JLPT3 = 2,
    ...

Однако,Как бы круто это не выглядело, в коробке нет ничего подобного, и вам придется:

  • реализовать атрибут ShortTextAttribute самостоятельно (легко)
  • реализовать атрибут LongTextAttribute самостоятельно (легко)
  • реализовать вспомогательный класс вспомогательных программ, который будет принимать значение CC и считывать его атрибут long / short для возврата текста (средний, но в Интернете есть готовые образцы)

Я не уверен, стоит ли это усилий, но наверняка это было бы хорошим упражнением.

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

Enum.GetValues ​​()

- это то, что вам нужно:

Enum.GetValues(typeof(CC)).Cast<CC>().Select(x => new ParamViewModel{ Id = (int)x, Name = x.Text()});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...