如何使用具有相同键的两个不同字典的值来构建新的字典 [英] How to build a new dictionary with values from two different dictionaries having same keys
问题描述
- 字典1:[{1,abc} {2, cde} {3,efg}]
- 字典2:[{1,123} {2,234} {3,345}]
-
创建一个字典如下:
字典3:[{abc,123} {cde,234} {efg,345}]fieldValues = new List< List< string>>();
docFieldKey =新列表< List< string>>();
docFieldValueDict =新字典< string,List< string>>();
docKeyDict = new Dictionary< string,List< string>>();
iterateDocKeyDict = new List< string>();
iterateDocFldValueDict = new List< string>();
//读取行智能存储键和所有值
(limit = 0; limit< docNames.Count; limit ++)
{
for row = 0; row< excelData.Count; row ++)
{
if(excelData [row] == docNames [limit])
{
for(colLimit = row + 1; colLimit< fieldNames.Count; colLimit ++)
{
flag = true;
fieldValues.Add(new List< string>());
fieldValues [limit] .Add(excelData [colLimit]);
}
if(flag == true)
{
docFieldValueDict.Add(docNames [limit],fieldValues [limit]);
}
}
}
}
//为每个docName添加连接键
for(limit = 0 ;限制< docNames.Count; limit ++)
{
for(colLimit = 0; colLimit< concatKey.Count; colLimit ++)
{
if(concatKey [colLimit]包含(docNames [limit]))
{
for(col = colLimit; col< fieldNames.Count - 1; col ++)
{
flag = true;
docFieldKey.Add(new List< string>());
docFieldKey [limit] .Add(concatKey [col]);
}
if(flag == true)
{
docKeyDict.Add(docNames [limit],docFieldKey [limit]);
}
}
}
}
//合并密钥和两个字典的值
limit = 0; limit< docKeyDict.Count; limit ++)
{
var docKeyDictCompare = docKeyDict.ElementAt(limit);
var docFldValueDictCompare = docFieldValueDict.ElementAt(limit);
iterateDocKeyDict = docKeyDictCompare.Value;
iterateDocFldValueDict = docFldValueDictCompare.Value;
if(docKeyDictCompare.Key == docFldValueDictCompare.Key)
{
for(col = 0; col< fieldNames.Count - 1; col ++)
{
if((iterateDocKeyDict.ElementAt(col)!= string.Empty)&&(iterateDocFldValueDict.ElementAt(col)!= string.Empty))
{
flag = true;
}
}
if(flag == true)
{
keyValuePairDict.Add(iterateDocKeyDict.ElementAt(col),iterateDocFldValueDict.ElementAt ));
}
}
}
我尝试了上述,但是我在
中得到索引超出范围异常if((iterateDocKeyDict.ElementAt(col)! = string.Empty)&&(iterateDocFldValueDict.ElementAt(col)!= string.Empty))
控制台中显示错误msg
字典我建议这样:
var dic1 = / * [{1,abc} {2,cde} {3,efg }] * /;
var dic2 = / * [{1,123} {2,234} {3,345}] * /;
var dic3 = dic1.ToDictionary(x => x.Value,x => dic2 [x.Key]);
但是看看你相当长的代码示例,我不知道这是否够了。
Let's say we have two dictionaries with the following key pair values:
- Dictionary 1 : [ {1,abc} {2,cde} {3,efg} ]
- Dictionary 2: [ {1,123} {2,234} {3,345} ]
I want to create a dictionary as follows: Dictionary 3 : [ {abc,123} {cde,234} {efg,345} ]
fieldValues = new List<List<string>>(); docFieldKey = new List<List<string>>(); docFieldValueDict = new Dictionary<string, List<string>>(); docKeyDict = new Dictionary<string, List<string>>(); iterateDocKeyDict = new List<string>(); iterateDocFldValueDict = new List<string>(); //To read row wise and store key and all values for (limit = 0; limit < docNames.Count; limit++) { for (row = 0; row < excelData.Count; row++) { if (excelData[row] == docNames[limit]) { for (colLimit = row + 1; colLimit < fieldNames.Count; colLimit++) { flag = true; fieldValues.Add(new List<string>()); fieldValues[limit].Add(excelData[colLimit]); } if (flag == true) { docFieldValueDict.Add(docNames[limit], fieldValues[limit]); } } } } //To add concatenated key for each docName for (limit = 0; limit < docNames.Count; limit++) { for (colLimit = 0; colLimit < concatKey.Count; colLimit++) { if (concatKey[colLimit].Contains(docNames[limit])) { for (col = colLimit; col < fieldNames.Count - 1; col++) { flag = true; docFieldKey.Add(new List<string>()); docFieldKey[limit].Add(concatKey[col]); } if (flag == true) { docKeyDict.Add(docNames[limit], docFieldKey[limit]); } } } } //to merge the key and the value from both dictionaries for (limit = 0; limit <docKeyDict.Count; limit++) { var docKeyDictCompare = docKeyDict.ElementAt(limit); var docFldValueDictCompare = docFieldValueDict.ElementAt(limit); iterateDocKeyDict = docKeyDictCompare.Value; iterateDocFldValueDict = docFldValueDictCompare.Value; if (docKeyDictCompare.Key == docFldValueDictCompare.Key) { for (col = 0; col < fieldNames.Count - 1; col++) { if ((iterateDocKeyDict.ElementAt(col)!=string.Empty) && (iterateDocFldValueDict.ElementAt(col)!=string.Empty)) { flag = true; } } if (flag == true) { keyValuePairDict.Add(iterateDocKeyDict.ElementAt(col), iterateDocFldValueDict.ElementAt(col)); } } }
I tried the above but I get index out of range exception at
if ((iterateDocKeyDict.ElementAt(col)!=string.Empty) &&(iterateDocFldValueDict.ElementAt(col)!=string.Empty))
Error msg displayed in Console
Just looking at your sample dictionaries I would suggest this:
var dic1 = /* [ {1,abc} {2,cde} {3,efg} ] */;
var dic2 = /* [ {1,123} {2,234} {3,345} ] */;
var dic3 = dic1.ToDictionary(x => x.Value, x => dic2[x.Key]);
But looking at your fairly long code sample I'm not sure it is enough.
这篇关于如何使用具有相同键的两个不同字典的值来构建新的字典的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!