如何将两个不同类型的列表合并为一个包含两种类型的新类型列表?

时间:2013-12-16 17:07:30

标签: c# linq enums

我想组合/合并/加入/无论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));

2 个答案:

答案 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()在值上被调用,打印输出有点没有实际意义。

我认为使用枚举作为字典案例拳击的关键。