如何将字符串值设置为枚举数

本文关键字:枚举 设置 字符串 | 更新日期: 2023-09-27 18:19:02

我有一个字符串,它包含整数和字符串,用逗号分隔。例如:

0, Link Alive,1, Link Dead,2, Link Weak,3, Wiznet 0 Dead,4, Wiznet 1 Dead,5, Wiznets Dead

我想用这个字符串创建一个像这样的enum:

public enum myEnums {
    Link Alive = 0,
    Link Dead = 2,
    Link Weak = 1,
    Wiznet 0 Dead = 3,
    Wiznet 1 Dead = 4,
    Wiznets Dead = 5
}

我正在考虑将字符串更改为字符数组。然后循环遍历char数组。如果我检测到一个整数,我将其值赋给一个临时整数值。如果我检测到一个字符串,我就把它的值赋给一个临时字符串。在此之后,我将把临时整数和字符串赋值给枚举数。

唯一的问题是,我不知道如何处理逗号和等号。

谁能告诉我应该怎么做?

如何将字符串值设置为枚举数

在我看来,你真正应该做的是创建一个Dictionary<string,int>,因为除非你要生成代码,否则你不能在运行时改变枚举,它是常量。

现在看看你的字符串:

0, Link Alive,1, Link Dead,2, Link Weak,3, Wiznet 0 Dead,4, Wiznet 1 Dead,5, Wiznets Dead

看起来您有一组逗号分隔的值。所以在,上分割,然后每对值是一个int和一个string。让它成为你的字典。

所以一个简单的方法来做到这一点可能看起来像这样(假设你的数据是好的,即它有偶数项和每个奇数项实际上可以解析为int):

var dict = new Dictionary<int,string>();    
var cells = source.Split(',');
for (var i=0; i < cells.Length; i+=2)
{
    dict[int.Parse(cells[i])] = cells[i+1].Trim();      // Note: you might want to check boundaries first!
}

或者使用Linq,你可以这样做:

    string source = "0, Link Alive,1, Link Dead,2, Link Weak,3, Wiznet 0 Dead,4, Wiznet 1 Dead,5, Wiznets Dead";
    var dict = source.Split(',')
        .Select((v,i) => new { v, i })
        .GroupBy(x => x.i/2)
        .ToDictionary(x => int.Parse(x.First().v), x => x.Skip(1).First().v.Trim());

给你一把小提琴。

解释我们在这里做什么:

  • 首先用Split将字符串放在,上。这给了我们一个字符串数组["0","Link Alive","1","Link Dead",...]
  • 接下来,我们使用Select来选择每个项目和它在一对中的索引。现在我们有了一个对象的集合,看起来像[{v="0",i=0},{v="Link Alive",i=1},...]
  • 现在我们通过将索引除以2来分组。因为这是整数除法,它会截断。所以0/2 == 0 1/2 == 0 2/2 == 1 3/2 == 1。因此,我们将其分类为值对。
  • 最后,我们将这些组(我们知道它们是值对)转换成字典。为此,我们使用每个组中的第一个项,并将其解析为int,并将其用作字典的键。然后我们使用第二个值作为值。这最终给了我们字典

现在有了字典,如果你想查找一个值,很容易:

var myValue = dict[2];   // myValue is now "Link Weak"

这里的枚举器是指可以迭代的对象。"enum"基本上是一组命名的整数。

所以如果你有一串用逗号分隔的项目,并且想要对它们进行"迭代",那么这可能会有所帮助:

string input = "0, Link Alive,1, Link Dead,2, Link Weak,3, Wiznet 0 Dead,4, Wiznet 1 Dead,5, Wiznets Dead"
string[] parts = input.split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries);
foreach (string part in parts)
{
    // do something
}