如何从将生成重复键的Array创建Dictionary

时间:2018-06-03 14:32:08

标签: c#

我有一个数组,我希望通过从等号(=)拆分数组值来转换为字典。等号前面的内容是关键,后面的内容是值。我的问题是,当分割数组并将它们添加到字典中时,数组中的某些值将具有相同的键名。

这是我的......

string[] myArray = new[] { "A=1", "B=2", "C=3", "A=4" };
Dictionary<string, string> myDictionary = myArray.Select(l => l.Split('=')).ToDictionary(a => a[0], a => a[1]);

正如预期的那样,我收到错误:ArgumentException was unhandled by user code,因为第一个和最后一个值将具有相同的键。

我希望能够做的是排除/忽略将生成重复键的值。换句话说,根据我的代码,我不想将值A=4添加到我的字典中。

知道最好的方法是什么?

仅供参考 - 如果我从数组中删除最后一个值,我的代码工作正常。

3 个答案:

答案 0 :(得分:2)

GroupBy之前使用ToDictionary

var result = myArray.Select(s => s.Split('='))
                    .GroupBy(a => a[0])
                    .ToDictionary(e => e.Key,
                             v => v.Select(a => a[1]).First());

或迭代并检查结果字典中是否包含该键:

Dictionary<string, string> accumulator = new Dictionary<string, string>();
foreach (var item in myArray.Select(x => x.Split('=')))
       if (!accumulator.ContainsKey(item[0]))
           accumulator.Add(item[0], item[1]);

答案 1 :(得分:1)

您可以使用GroupBy,并将拆分值按其第一个值(索引0)分组,然后获取每个组的第一个(忽略索引0中具有相同值的其他组):

  var  myArray.Select(l => l.Split('=')).GroupBy(x=>x[0]).Select(x=>x.FirstOrDefault());

或者在添加到词典时只执行忽略部分:

foreach(string[] x in  myArray.Select(l => l.Split('=')).ToArray())
{
     if(!Dic.ContainsKey(x[0]))Dic.Add(x[0], x[1]);
}

答案 2 :(得分:1)

使用以下代码将给定数组转换为唯一字典。 GroupBy基于Key的左侧对数据进行分组,后来ToDictionary将获取的分组结果转换为字典。

 Dictionary<string, string> myDictionary = myArray.Select(l => 
     { 
        var splittedStrings = l.Split('=');
        return new { Key = splittedStrings[0], Val = splittedStrings[1] };
      }).GroupBy(g => g.Key)
     .ToDictionary(a => a.Key, a => a.First().Val);