【问题标题】:How to convert CSV string to List<Enum>如何将 CSV 字符串转换为 List<Enum>
【发布时间】:2013-07-18 19:36:34
【问题描述】:

我已经定义了枚举事件:

public enum Events {
  UNLOCK = 1,
  LOCK = 2
}

还有 CSV 字符串:

var csv = "1,2";

在 C# 中将 csv 字符串转换为 List 的更好方法是什么?

【问题讨论】:

    标签: c# generics


    【解决方案1】:
    csv.Split(',').Select(s => (Events)Enum.Parse(typeof(Events), s));
    

    顺便说一句,generic enum class 你可以这样解析Enum&lt;Events&gt;.Parse(s),整个代码看起来像:

    csv.Split(',').Select(Enum<Events>.Parse)
    

    【讨论】:

    • 谢谢,你给我带来了一个让它更通用的想法:csv.Split(',').Select(s => (T)Enum.Parse(typeof(T), s) ).ToList();
    • @user576700 想法已经存在 - 您可以创建 generic enum class 更新答案:)
    【解决方案2】:
    csv.Split(',').Select(x => (Events)int.Parse(x)).ToList();
    

    【讨论】:

    • 可能是因为您的答案没有返回列表。只是猜测。
    【解决方案3】:

    更详细的方式:

        var csv = "2,1,1,2,2,1";
    
        List<Events> EventList = new List<Events>();
    
        foreach (string s in csv.Split(','))
        {
            EventList.Add((Events)Enum.Parse( typeof(Events), s, true));
        }
    

    【讨论】:

      【解决方案4】:

      如果您的整个 CSV 行不只是事件,请使用正则表达式将行解析为其组件。在这里,我们有一个混合的 CSV 行,正则表达式可以使用命名匹配捕获来分解每个值。从那里我们使用 linq 将其解析为找到的每一行数据的新投影。

      var csvLine = "1245,1,2,StackOverFlow";
      var pattern = @"
      ^                          # Start at the beginning of each line.
      (?<IDasInteger>[^,]+)      # First one is an ID
      (?:,)                      # Match but don't capture the comma
      ((?<Events>[^,]+)(?:,)){2} # 2 Events
      (?<Summary>[^\r\n]+)       # Summary text";
      
      var resultParsed = Regex.Matches(csvLine, pattern, RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline)
                              .OfType<Match>()
                              .Select (mt => new {
      
                              ID = int.Parse (mt.Groups["IDasInteger"].ToString()),
                              Event = mt.Groups["Events"].Captures
                                                         .OfType<Capture>()
                                                         .Select (cp => (Events)Enum.Parse(typeof(Events),  cp.Value))),
                              Summary = mt.Groups["Summary"].ToString()
                        });
      

      【讨论】:

      • mt.Groups["Events"],它看起来不像是一个神奇的字符串地狱:),只是在想@lazyberezovsky 回答得很好时为什么会有这么多代码:)
      • @user576700 我已经处理了包含多列数据的 CSV 文件。通过指定命名捕获,我确保在处理时正确的数据进入正确的位置。对于您的情况,不,这没有任何意义,但是对于获取的数据类型和数量不同的更稳健的情况,命名为每行捕获的正则表达式可能是一个非常好的选择。至于其他答案,我认为大多数人都喜欢能够在不同的场景之间进行选择。我知道我知道...
      猜你喜欢
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多