我想组合/合并/加入/无论enum
列表是什么,以便统一列表中的每个项目都有两个字段 - enum
项的名称({{1 }})及其值(string Name
):
TokensEnum Token
如何编写以下方法的主体(最好是LINQ方式)?
var tokens = Enum.GetValues(typeof (TokensEnum));
var names = Enum.GetNames(typeof (TokensEnum));
var combined = InTheDarknessBindThem(tokens,names);
foreach(var c in combined)
MessageBox.Show(string.Format(
"Token \"{0}\" value is {1}", c.Name, (int)c.Token));
答案 0 :(得分:4)
如果两个列表都是有序的,您可以使用Zip
扩展方法:
tokens.Cast<TokensEnum>().Zip(names, (t, n) => Tuple.Create(t, n));
这将返回IEnumerable<Tuple<TokensEnum, string>>
。
但是作为Jon Skeet suggests,在这种情况下,做这样的事情可能会更容易:
Enum.GetValues(typeof(TokensEnum))
.Cast<TokensEnum>()
.Select(t => Tuple.Create(t, t.ToString()));
这将返回与上面相同的结果,但它将在一个步骤中完成。
由于您在评论中提到您希望拥有Dictionary<string, TokensEnum>
,因此您可以使用以下内容构建它:
Dictionary<string, TokensEnum> myDictionary =
Enum.GetValues(typeof(TokensEnum))
.Cast<TokensEnum>()
.ToDictionary(t => t.ToString());
答案 1 :(得分:1)
为什么不是字典?
var dict = Enum.GetValues(typeof (TokensEnum))
.Cast<TokensEnum>()
.ToDictionary(x => x, x => x.ToString());
foreach (var kvp in dict)
{
Console.WriteLine("Value: {0}, Name: {1}",kvp.Key,kvp.Value);
}
由于ToString()在值上被调用,打印输出有点没有实际意义。
我认为使用枚举作为字典案例拳击的关键。