从字符串列表中获取枚举的值

时间:2019-03-01 13:33:14

标签: c#

我有一堂课叫做MyProduct

如下所示

public class MyProduct {
   public string Id { get; set; }

    public string CustomId { get; set; }
}

然后我创建了另一个课程ListProducts

public class ListProducts
{
  public static readonly List<MyProduct > MyListOfProducts = new List<MyProduct >()
    {
       new MyProduct(){
           Id = "1",
           CustomId = ((int)MyEnum.NameOfService).ToString()
       },
        new MyProduct(){
           Id = "2",
           CustomId = ((int)MyEnum.AgeOfService).ToString()
       }
    };

 public enum MyEnum{
   NameOfService = 12,
   AgeOfService = 11
 }


}

现在,我想在类ListProducts中创建一个方法,当我向其传递ID时,它将返回我enum字符串。

例如,如果我通过Id = 1,那么它应该以{NameOfService”的身份返回我enum的值

我正在尝试类似以下的内容

public static MyEnum GetStringFromEnum(string id) => ListProducts.FirstOrDefault(x=> x.Id == Id);

但是它没有返回我的enum

6 个答案:

答案 0 :(得分:2)

您可以尝试一下吗?

  public MyEnum GetStringFromEnum(string id)
        {

            var product = MyListOfProducts.FirstOrDefault(x => x.Id.Equals(id));
            MyEnum myEnum = (MyEnum)Convert.ToInt32(product?.CustomId);
            return myEnum;

        }

对于单行:

public MyEnum GetStringFromEnum(string id) =>(MyEnum) Convert.ToInt32(MyListOfProducts.FirstOrDefault(x => x.Id.Equals(id))?.CustomId);

答案 1 :(得分:1)

您的方法名为“ GetStringFromEnum”,但是您正在传递ID和ID,并返回一个枚举。我将其称为“ GetEnumFromId”或仅“ GetEnum”。同时将CustomId属性设置为int。您仍然需要将其强制转换为(int),但不再需要使用.toString。

public class MyProduct {
   public string Id { get; set; }

    public int CustomId { get; set; }
}
public static readonly List<MyProduct > MyListOfProducts = new List<MyProduct >()
    {
       new MyProduct(){
           Id = "1",
           CustomId = (int)MyEnum.NameOfService
       },
        new MyProduct(){
           Id = "2",
           CustomId = (int)MyEnum.AgeOfService
       }
    }

也无需编号您的枚举。在NameOfServer下将为1,在AgeOfService下将为2。

public enum MyEnum{
   NameOfService,
   AgeOfService
 }

然后您可以执行以下操作:

public static MyEnum GetEnum(string id) => ListProducts.FirstOrDefault(x=> x.CustomId == Id);

答案 2 :(得分:1)

如果要从其值中获取枚举名称,则可以使用Enum.GetName()方法,如下所示。您可以传递产品ID,并基于此获得枚举值,下面的函数将为您提供枚举名称

Enum.GetName(typeof(MyEnum), 2)

答案 3 :(得分:1)

您可以使用System.Enum为您获取名称。 您应该查看其中的所有methods-它们可以帮助满足您的枚举需求。

    string GetProduct(int number)
    {
        int index = lookupIndex(number);
        return Enum.GetNames(typeof(MyEnum))[index];
    }

    private int lookupIndex(int number)
    {
        //this fits your current metadata, you could adapt the lookup here.
        return number - 1;
    }

接受的答案偏离了我的期望。这是要考虑的其他片段:

    public MyEnum GetProduct(string name)
    {
        return (MyEnum)Enum.Parse(typeof(MyEnum), name);
    }

    public MyEnum GetProduct(int number)
    {
        return (MyEnum)number;
    }

    private int lookupIndex(int number)
    {
        Array values = Enum.GetValues(typeof(MyEnum));
        int[] intArray = (int[])values;
        return Array.FindIndex(intArray, x => x == number);
    }

以下是一些可能会派上用场的相关问题的其他选择:

using System;
using System.Linq;

public enum foo
{
    unknown = 0,
    bar = 42,
    baz
}

class Program
{

    static void Main(string[] args)
    {
        Console.WriteLine($"Enum.GetName  : '{Enum.GetName(typeof(foo), 42)}'");

        var getnames = Enum.GetNames(typeof(foo));
        string names = string.Join(", ", getnames);
        Console.WriteLine($"Enum.GetNames : '{names}'");

        var getValues = Enum.GetValues(typeof(foo)); ;
        var values = string.Join(", ", from v in getValues.Cast<int>() select v.ToString());
        Console.WriteLine($"Enum.GetValues: '{values}'");

        foo caseSensitiveUnknown = (foo)Enum.Parse(typeof(foo), nameof(foo.unknown));
        Console.WriteLine($"Enum.Parse 1:   '{caseSensitiveUnknown}'");

        foo ignoreCaseUnknown = (foo)Enum.Parse(typeof(foo), "UnKnoWn", true);
        Console.WriteLine($"Enum.Parse 2:   '{ignoreCaseUnknown}'");
    }
}

我认为您更深层的设计问题是,对于似乎相同的事物,您有5个身份。您的5个身份分别是MyEnumCustomIdId(int)MyEnumEnum.GetName(typeof(MyEnum), e)。 问题是,即使在大型系统中,您也需要维护所有它们。在某个时候,您将创建一个带有用于枚举的表的数据库,并且还需要在连接库上维护名称和整数。与其选择像这样的大型big依派对,要么:

public class MyEnumConverter
{
    public static string ToCustomId(MyEnum e) => $"{(int)e}";
    public static string ToId(MyEnum e) => ListProducts.MyListOfProducts.First(x => x.CustomId == $"{(int)e}").Id;
    public static int ToEnumValue(MyEnum e) => (int)e;
    public static string ToEnumName(MyEnum e) => Enum.GetName(typeof(MyEnum), e);
    public static MyEnum FromCustomId(string customId) => (MyEnum)(int.Parse(customId));
    public static MyEnum FromId(string Id) => FromCustomId(ListProducts.MyListOfProducts.First(x => x.Id == Id).CustomId);
    public static MyEnum FromEnumValue(int enumValue) => (MyEnum)(enumValue);
    public static MyEnum FromEnumName(string name) => (MyEnum)Enum.Parse(typeof(MyEnum), name);
}

考虑只为完全独立于含义的System.Guid之类的产品维护一个唯一的ID。

答案 4 :(得分:0)

您可以尝试获取指定整数值的名称,然后获取枚举:

int integerenumvalue = 14;
string stringenum = Enum.GetName(typeof(MyEnum), integerenumvalue);
MyEnum enumvalue = (MyEnum)Enum.Parse(typeof(MyEnum), stringenum);

答案 5 :(得分:0)

除了这里给出的获得价值的答案外,我对设计也很关注。这两个数字是常量还是配置值?

在这种情况下,我强烈反对使用枚举。