比较两个词典并使用两个词典中的键和值合并到其他词典中

时间:2014-04-17 06:50:14

标签: c# dictionary

我正在研究小实用程序,因为事实证明我必须比较两个字典并以下面的格式导出Excel中的数据

密钥dict1value dict2value

如果两个字典中都有密钥。我的输出是 关键字dict1value dict2value 如果第一个字典中有一个键,而不是第二个。我的输出是 密钥dict1值“NotAvailable” 如果某个键在第二个字典中可用但在第一个字典中不可用。我的输出是 键“不可用”dict2value。

更清楚一点,Excel中的键列包含来自两个词典的键。值列将根据可用性而具有值。

虽然以下代码正常运行,但我想知道是否可以进一步优化性能。 注意:请忽略错误的命名约定

        public void validateTwoDictionaries()
    {
        Dictionary<string, string> dict1 = new Dictionary<string, string>();
        Dictionary<string, string> dict2 = new Dictionary<string, string>();
        Dictionary<string, KeyValuePair<string, string>> complexdicts = new Dictionary<string, KeyValuePair<string, string>>();

        dict1.Add("A", "1");
        dict1.Add("B", "2");

        dict2.Add("A", "2");
        dict2.Add("C", "3");
        dict2.Add("D", "4");

        int count1 = dict1.Keys.Count;
        int count2 = dict2.Keys.Count;
        int maxcount = count2;
        if (count1 > count2)
        {
            maxcount = count1;

        }

        for (int i = 0; i < maxcount; i++)
        {
            string dict1Key = string.Empty; string dict2Key = string.Empty;
            //need to iterate both the dictionaries at one go.
            if (i < count1)
            {
                dict1Key = dict1.Keys.ElementAt(i);
            }
            if (i < count2)
            {
                dict2Key = dict2.Keys.ElementAt(i);
            }

            // do the work for first dictionary, try to decouple to reuse for the 2nd dict
            if (dict1Key != string.Empty)
            {
                if (!complexdicts.Keys.Contains(dict1Key))
                {
                    if (dict2.Keys.Contains(dict1Key))
                    {
                        // Add to the complext dictionary 
                        complexdicts.Add(dict1Key, new KeyValuePair<string, string>(dict1[dict1Key], dict2[dict1Key]));
                    }
                    else
                    {
                        complexdicts.Add(dict1Key, new KeyValuePair<string, string>(dict1[dict1Key], "Not Available"));
                    }
                }
            }



            // do the work for second dictionary

            if (dict2Key != string.Empty)
            {
                if (!complexdicts.Keys.Contains(dict2Key))
                {
                    if (dict1.Keys.Contains(dict2Key))
                    {
                        // Add to the complext dictionary 
                        complexdicts.Add(dict2Key, new KeyValuePair<string, string>(dict1[dict2Key], dict2[dict2Key]));
                    }
                    else
                    {
                        complexdicts.Add(dict2Key, new KeyValuePair<string, string>("Not Available", dict2[dict2Key]));
                    }
                }
            }
        }

dict1和dict2是示例词典和complexdicts对象是我想要导出到excel的。 如果我能以更好的方式做到这一点,请告诉我。

2 个答案:

答案 0 :(得分:3)

这个怎么样?

Dictionary<string, string> dict1 = new Dictionary<string, string>();
Dictionary<string, string> dict2 = new Dictionary<string, string>();
Dictionary<string, KeyValuePair<string, string>> complexdicts = new Dictionary<string, KeyValuePair<string, string>>();

dict1.Add("A", "1");
dict1.Add("B", "2");

dict2.Add("A", "2");
dict2.Add("C", "3");
dict2.Add("D", "4");

var allKeys = dict1.Keys.Union(dict2.Keys);

foreach (var key in allKeys)
{
    string val1;
    if (!dict1.TryGetValue(key, out val1))
    {
        val1 = "Not Available";
    } 
    string val2;
    if (!dict2.TryGetValue(key, out val2))
    {
        val2 = "Not Available";
    }
    complexdicts.Add(key, new KeyValuePair<string, string>(val1, val2));
}

答案 1 :(得分:0)

这个怎么样?

Dictionary<string, string> dict1 = new Dictionary<string, string>();
Dictionary<string, string> dict2 = new Dictionary<string, string>();

dict1.Add("A", "1");
dict1.Add("B", "2");

dict2.Add("A", "2");
dict2.Add("C", "3");
dict2.Add("D", "4");

var allKeys = dict1.Keys.Union(dict2.Keys);

// case 1
List<Tuple<string, string, string>> unionValues = new List<Tuple<string, string, string>>();
foreach (var key in allKeys)
{
    unionValues.Add(new Tuple<string, string, string>(key, dict1.ContainsKey(key) ? dict1[key] : "N/A" , dict2.ContainsKey(key) ? dict2[key] : "N/A"));
}

// case 2
var result = (from key in allKeys
             select new Tuple<string, string, string>(key, dict1.ContainsKey(key) ? dict1[key] : "N/A", dict2.ContainsKey(key) ? dict2[key] : "N/A")).ToList();
相关问题