Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何统一字典中的两个数组?_C# - Fatal编程技术网

C# 如何统一字典中的两个数组?

C# 如何统一字典中的两个数组?,c#,C#,如果您有两个数组string[]a和int[]b,您如何以最少的代码从中最有效地获取词典?假设它们包含相同数量的元素 例如,这是最好的方法吗 Dictionary<string,int> vals = new Dictionary<string,int>(); for(int i = 0; i < size; i++) { vals.Add(a[i],b[i]); } Dictionary vals=new Dictionary(); 对于(int i=0

如果您有两个数组
string[]a
int[]b
,您如何以最少的代码从中最有效地获取
词典?假设它们包含相同数量的元素

例如,这是最好的方法吗

Dictionary<string,int> vals = new Dictionary<string,int>();
for(int i = 0; i < size; i++)
{
    vals.Add(a[i],b[i]);
}
Dictionary vals=new Dictionary();
对于(int i=0;i
如果您的目标是匹配序列中的位置,则可以使用
Enumerable.Zip

int[] myInts = { 1, 2 };
string[] myStrings = { "foo", "bar"};

var dictionary = myStrings.Zip(myInts, (s, i) => new { s, i })
                          .ToDictionary(item => item.s, item => item.i);
而且,由于您使用的是数组,所以“直接”编写它实际上并不那么长。但是,您希望事先验证数组的长度是否确实相等

var dictionary = new Dictionary<string, int>();

for (int index = 0; index < myInts.Length; index++)
{
    dictionary.Add(myStrings[index], myInts[index]);
}
var dictionary=newdictionary();
for(int index=0;index

通常,Linq可以产生更具表现力、更易于理解的代码。在这种情况下,相反的情况是正确的,这是有争议的。

如果这是.Net 4,那么您可以执行以下操作:

var result = a.Zip(b, (first, second) => new {first, second})
    .ToDictionary(val => val.first, val => val.second);
如果没有Zip,您也可以执行以下操作:

var result = Enumerable.Range(0, a.Length).ToDictionary(i => a[i], i => b[i]);
使用ToDictionary:

        int idx = 0;
        var dict = b.ToDictionary(d => a[idx++]);

你的意思是用字符串[]a中的键和int[]b中的值(假设它们大小相同)创建一个字典吗?你刚才添加的方法确实非常简单直接。是的,您可以使用Linq编写一行程序,但是请将您的代码与答案中的示例(包括我的示例)进行比较。Linq版本是更容易理解还是更难理解?谢谢,我会使用我的方法,但不知道4.0 aded Zip方法:)多么酷的名字。但对于这种情况,我认为匿名类型和方法的函数式可能更难+就像我一样,人们可能会想知道什么是Zip,然后又想它是Zip:)我认为你的方法是最好的。首先,它比使用Linq更具可读性,其次,它很可能更快。对于这样一个简单的任务,直截了当的方法(正如您所写的)很好。使用LINQ保存一行代码(如果您查看它,您不会这样做)将大大降低过程的速度。LINQZIP中涉及的方法调用相对昂贵。如果速度是一个问题,那么问题应该是是否有方法批量更新字典。我可能是少数,但实际上我更喜欢Enumerable.Range解决方案。更容易看。@ToddMenier您的编辑不正确。
Range
的第二个参数是要生成的项数,而不是包含的外部边界。您的编辑会导致跳过最后一项。您是对的,谢谢您的关注。“我有一个奇怪的情况,我的起始索引是1,得到了一个超出范围的异常,并做出了一个错误的假设来解释原因。”托德迈尼尔同意!我希望这是最重要的答案:)我也觉得它在逻辑上更简单-它只是从一个整数列表,到由每个数组中该位置的项组成的键值对。我认为zip方法非常类似,但不需要中间数据类型,这是错误的。值lambda应该是
x=>b[a.IndexOf(x)]
重复的
IndexOf
调用将比
for
循环慢。这还假设
x
只在列表中出现一次,这可能不是真的。
        int idx = 0;
        var dict = b.ToDictionary(d => a[idx++]);