代码之家  ›  专栏  ›  技术社区  ›  Sam

将int列表转换为enum列表的简明方法

c#
  •  0
  • Sam  · 技术社区  · 3 月前

    我需要转换以下列表 int 值列表 enum 值,反之亦然。我可以创建一个简单的转换方法,但想看看是否有更简洁的方法来处理这个问题。

    以下是我的枚举值:

    public enum AutoShipOption
    {
       Monthly = 2,
       Weekly = 1,
       Yearly = 3,
       Undefined = 0
    }
    

    在我用来定义商店项目的类中,我得到一个 List<int> 我需要转换为 List<AutoShipOption> 正如我所说的,很容易创建一个简单的方法来处理这个问题,如下所示:

    public List<AutoShipOption> AutoShipOptionsMapper(List<int> values)
    {
       var options = new List<AutoShipOption>();
    
       if(values == null || values.Count == 0)
          return options;
    
       foreach(var item in values)
          if(item > 0)
             options.Add((AutoShipOption)item);
    
       return options;
    }
    

    是否有更简洁的方法来处理这种转换?

    2 回复  |  直到 3 月前
        1
  •  4
  •   SELA    3 月前

    这就是通过LINQ所需要的一切:

          public static List<AutoShipOption> AutoShipOptionsMapper(List<int> values)
            {
                if (values == null)
                    return new List<AutoShipOption>();
    
                return values
                    .Where(item => Enum.IsDefined(typeof(AutoShipOption), item))
                    .Select(item => (AutoShipOption)item)
                    .ToList();
            }
    

    请参阅下面的完整代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace EnumConversion
    {
        public enum AutoShipOption
        {
            Monthly = 2,
            Weekly = 1,
            Yearly = 3,
            Undefined = 0
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                List<int> intValues = new List<int> { 1, 2, 3, 4, 0, -1 };
                List<AutoShipOption> enumValues = AutoShipOptionsMapper(intValues);
                Console.WriteLine("AutoShipOptions values:");
                foreach (var option in enumValues)
                {
                    Console.WriteLine(option);
                }
            }
    
            public static List<AutoShipOption> AutoShipOptionsMapper(List<int> values)
            {
                if (values == null)
                    return new List<AutoShipOption>();
    
                return values
                    .Where(item => Enum.IsDefined(typeof(AutoShipOption), item))
                    .Select(item => (AutoShipOption)item)
                    .ToList();
            }
        }
    }
    

    请参阅工作中的.netfid here

        2
  •  0
  •   Michał Turczyn    3 月前

    您可以使用LINQ Cast 如下所示:

    var ints = new List<int> { 0, 1, 2, 3 };
    var enums = ints
        .Where(x => Enum.IsDefined<AutoShipOption>(x))
        .Cast<AutoShipOption>()
        .ToList();
    

    这样的方法可以封装在一些通用方法中:

    public static class EnumEnumerableExtensions
    {
        public static List<T> SafeListCast<T>(this List<T> list)
            where T : struct, Enum
        {
            return list.SafeCast().ToList();
        }
    
        public static IEnumerable<T> SafeCast<T>(this IEnumerable<T> enumerable)
            where T : struct, Enum
        {
            return enumerable
                .Where(Enum.IsDefined)
                .Cast<T>();
        }
    }
    

    然后,该示例将被简化:

    var ints = new List<int> { 0, 1, 2, 3 };
    var enums = ints.SafeListCast<AutoShipOption>();