C# 使用ToDictionary创建字典

C# 使用ToDictionary创建字典,c#,linq,c#-4.0,C#,Linq,C# 4.0,我有两个大小相同的字符串列表。 我想创建一个字典,键是fromlistA,值是fromlistB 什么是快捷方式 我使用了代码: List<string> ListA; List<string> ListB; Dictionary<string,string> dict = new Dictionary<string,string>(); for(int i=0;i<ListA.

我有两个大小相同的字符串列表。 我想创建一个字典,键是from
listA
,值是from
listB

什么是快捷方式

我使用了代码:

        List<string> ListA;
        List<string> ListB;
        Dictionary<string,string> dict = new Dictionary<string,string>();
        for(int i=0;i<ListA.Count;i++)
        {
              dict[key] = listA[i];
              dict[value]= listB[i];
        }
列表列表a;
名单b;
Dictionary dict=新字典();

对于(int i=0;i您可以使用索引创建一个匿名类型,您可以使用该索引获取该索引处的
B

Dictionary<string, string> dict = ListA
    .Select((a, i) => new { A = a, Index = i })
    .ToDictionary(x => x.A, x => ListB.ElementAtOrDefault(x.Index));
Dictionary dict=ListA
.选择((a,i)=>new{a=a,Index=i})
.ToDictionary(x=>x.A,x=>ListB.ElementAtOrDefault(x.Index));

请注意,如果
ListB
小于
ListA
,从.NET 4.0开始,可以使用LINQ的方法执行此操作,如下所示:

var res = ListA.Zip(ListB, (a,b) => new {a, b})
               .ToDictionary(p=>p.a, p=>p.b);
[Zip]方法将第一个序列的每个元素与第二个序列中具有相同索引的元素合并


我不想麻烦(如果可能的话),因为您的版本可读性强,易于调试,比任何其他LINQ解决方案都要快(特别是当您使用大列表时)。

我不会更改您的版本

在您的例子中,下面的代码比LINQ更具可读性,IMHO

var ListA = new List<string>();
var ListB = new List<string>();
var dict = new Dictionary<string, string>();

for (int i = 0; i < ListA.Count; i++)
{
    dict.Add(ListA[i], ListB[i]);
}
var ListA=new List();
var ListB=新列表();
var dict=新字典();
for(int i=0;i
你确定Zip能保证秩序吗?虽然这个答案完全正确,但我必须补充一点,我认为如果有这么简单的事情(从两个列表中创建一个字典),这不是一个好主意需要读取代码的开发人员打开MSDN文档以检查实际完成的操作。@MassimilianoPeluso此实现绝对没有本质上的低效:它在
O(N)中完成
,不执行不必要的查找,并在一个简单语句中完成一些原本需要循环的事情。虽然理论上可能较慢,但很难找到一个自然的例子,其中效率非常重要,可以保证将此语句重写为更有效的语句。无论如何,重写f或者,没有分析的效率是过早进行微优化的一种情况。@dasblinkenlight在这种情况下,我不会使用LINQ,它无助于提高可读性,因为使用经典循环(@ken2k-answer)很容易实现。如果您使用大列表测试它(秒表),您将看到性能差异(LINQ内部使用循环).无论如何,问题是:在这种情况下使用LINQ的优势是什么?@MassimilianoPeluso对我来说,使用
Zip
的优势是可读性稍好。然而,我完全理解我的答案是有偏见的,因为我已经连续使用LINQ近五年了;很多C#从业者都会这么做这两种方法的可读性截然相反。