在一行LINQ语句中列出具有增量关键字的字典

本文关键字:字典 关键字 一行 语句 LINQ | 更新日期: 2023-09-27 18:04:48

我有这个列表:

var items = new List<string>() { "Hello", "I am a value", "Bye" };

我希望它将其转换为具有以下结构的词典:

var dic = new Dictionary<int, string>()
{
     { 1, "Hello" },
     { 2, "I am a value" },
     { 3, "Bye" }
};

正如您所看到的,字典键只是增量值,但它们也应该反映列表中每个元素的位置。

我正在寻找一行LINQ语句。类似这样的东西:

var dic = items.ToDictionary(i => **Specify incremental key or get element index**, i => i);

在一行LINQ语句中列出具有增量关键字的字典

您可以通过使用传递元素索引的Enumerable.Select重载来实现这一点:

var dic = items.Select((val, index) => new { Index = index, Value = val})
               .ToDictionary(i => i.Index, i => i.Value);
static void Main(string[] args)
{
    var items = new List<string>() { "Hello", "I am a value", "Bye" };
    int i = 1;
    var dict = items.ToDictionary(A => i++, A => A);
    foreach (var v in dict)
    {
        Console.WriteLine(v.Key + "   " + v.Value);
    }
    Console.ReadLine();    
}

输出

1   Hello
2   I am a value
3   Bye

编辑:出于好奇,我用300万个字符串做了一个性能测试。

第一名:SimpleFor循环使用循环计数作为键值向字典中添加项目。(时间:00:00:00.2494029(

第二名:这个答案使用了LINQ之外的整数变量。时间(00:00:00.2931745(

第三名:尤瓦尔·伊兹恰科夫的答案,在一条线上完成。时间(00:00:00.7308006(

var items = new List<string>() { "Hello", "I am a value", "Bye" };

解决方案#1

var dic2 = items.Select((item, index) => new { index, item })
                .ToDictionary(x => x.item, x => x.index);

解决方案#2

int counter = 0;
var dic = items.ToDictionary(x => x, z => counter++);