C# 是否有方法通过枚举来构造数组?

C# 是否有方法通过枚举来构造数组?,c#,enums,C#,Enums,我有一段代码,逐行创建一个数组: 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 Param

我有一段代码,逐行创建一个数组:

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()    },
        };
是否有任何方法可以基于枚举本身实现这一点,或者是逐行编码的唯一方法?以下是我拥有的枚举:

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 "";
        }
    }
}
Enum.GetValues()

这是您需要的:

Enum.GetValues(typeof(CC)).Cast<CC>().Select(x => new ParamViewModel{ Id = (int)x, Name = x.Text()});
Enum.GetValues(typeof(CC)).Cast().Select(x=>newparamViewModel{Id=(int)x,Name=x.Text()});
Enum.GetValues()

这是您需要的:

Enum.GetValues(typeof(CC)).Cast<CC>().Select(x => new ParamViewModel{ Id = (int)x, Name = x.Text()});
Enum.GetValues(typeof(CC)).Cast().Select(x=>newparamViewModel{Id=(int)x,Name=x.Text()});

查看
系统.Enum
类。它有许多有用的方法,如
GetNames
GetValues
,允许您读取
enum
类型的所有条目。再加上一些LINQ,半自动处理它们真的很简单

一旦有了枚举项列表,就可以简单地将它们强制转换为
int
以获取数值,或者可以使用
enum.GetName
.ToString
获取它们的名称

您可能还想查看本文中的一些非LINQ提示,了解如何使用System.Enum.xxx方法

但是,这只会帮助您提取直接描述
enum
类型的数据。这意味着CC.JLPT3->(int)2或CC.JLPT3->(string)“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值并读取其长/短属性以返回文本(中等,但internet已准备好使用示例)

我不确定这是否值得,但可以肯定这是一个很好的练习。

查看
System.Enum
类。它有许多有用的方法,如
GetNames
GetValues
,允许您读取
enum
类型的所有条目。再加上一些LINQ,半自动处理它们真的很简单

一旦有了枚举项列表,就可以简单地将它们强制转换为
int
以获取数值,或者可以使用
enum.GetName
.ToString
获取它们的名称

您可能还想查看本文中的一些非LINQ提示,了解如何使用System.Enum.xxx方法

但是,这只会帮助您提取直接描述
enum
类型的数据。这意味着CC.JLPT3->(int)2或CC.JLPT3->(string)“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值并读取其长/短属性以返回文本(中等,但internet已准备好使用示例)

我不确定这是否值得,但可以肯定这是一个很好的锻炼。

谢谢,我想可能还需要再多走一步。我尝试了您的代码,它给出了一条错误消息:/Users/Japanese new/Japanese/Views/Cards/Cards.xaml.cs(29,29):错误CS0266:无法隐式地将类型“System.Collections.Generic.IEnumerable”转换为“Japanese.ParamViewModel[]”。存在显式转换(是否缺少转换?)(CS0266)(日语)只需在末尾添加一个.ToArray()。谢谢,我认为可能还需要一个步骤。我尝试了您的代码,它给出了一条错误消息:/Users/Japanese new/Japanese/Views/Cards/Cards.xaml.cs(29,29):错误CS0266:无法隐式地将类型“System.Collections.Generic.IEnumerable”转换为“Japanese.ParamViewModel[]”。存在显式转换(是否缺少强制转换?)(CS0266)(日语)只需在末尾添加一个.ToArray()