如何将字符串值设置为枚举数
本文关键字:枚举 设置 字符串 | 更新日期: 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
}