我有这个清单:
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);
答案 0 :(得分:17)
你可以通过使用传递元素索引的Enumerable.Select
的重载来实现:
var dic = items.Select((val, index) => new { Index = index, Value = val})
.ToDictionary(i => i.Index, i => i.Value);
答案 1 :(得分:2)
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万字符串列表的性能测试。
第一名:Simple For循环使用循环计数作为键值将项添加到字典中。 (时间:00:00:00.2494029)
第二名:这个答案使用LINQ之外的整数变量。时间(00:00:00.2931745)
第三名:Yuval Itzchakov的答案在一条线上完成所有工作。时间(00:00:00.7308006)
答案 2 :(得分:-2)
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++);