如何使用具有相同键的两个不同字典的值来构建新的字典 [英] How to build a new dictionary with values from two different dictionaries having same keys

查看:328
本文介绍了如何使用具有相同键的两个不同字典的值来构建新的字典的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们有两个具有以下密钥对值的字典:




  • 字典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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆