5

我已经定义了枚举事件:

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

以及 CSV 字符串:

var csv = "1,2";

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

4

4 回答 4

16
csv.Split(',').Select(s => (Events)Enum.Parse(typeof(Events), s));

顺便说一句,您可以使用通用枚举类进行解析Enum<Events>.Parse(s),整个代码将如下所示:

csv.Split(',').Select(Enum<Events>.Parse)
于 2013-07-19T13:34:09.387 回答
1
csv.Split(',').Select(x => (Events)int.Parse(x)).ToList();
于 2013-07-19T13:34:03.243 回答
0

更详细的方式:

    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));
    }
于 2013-07-19T13:39:03.197 回答
0

如果您的整个 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()
                  });
于 2013-07-19T13:56:39.333 回答