使用foreach和.contains比较两个词典以查找唯一和非唯一数据的最快方法

时间:2016-09-16 10:47:11

标签: c# dictionary

我目前有2个字典,其中包含30,000个密钥。

我目前正在使用两个foreach循环来查找dict1中的唯一键。我将dict2中的唯一键写入另一个字典(3)。

如果键匹配,我执行检查以查看值是否相同。如果它们不相同则打印。

使用foreach是否更好,它似乎正在影响性能。还有其他更快的解决方案或内置功能吗?我已经尝试了dict.contains方法。

Dict1                    Dict2

Keys    Values           Keys     Values        
S0111   00000            S0000    00010
S0000   00010            S0020    00015
S0020   00015            S0040    00150
S0040   00200            S0050    00250
        foreach (KeyValuePair<string, string> sourceRow in sourceData)
        {
            foreach (KeyValuePair<string, string> dumpRow in dumpData)
            {
                // A in C, skip
                if (sourceRow.Key == dumpRow.Key)
                {
                    Is_Unique_Address = false;

                    if (sourceRow.Value != dumpRow.Value)
                    {
                        Data_Mismatch_Criteria(sourceRow.Key, sourceRow.Value, dumpRow.Key, dumpRow.Value);
                    }

                }
            }
        }

3 个答案:

答案 0 :(得分:5)

此代码允许您从dict2中选择密钥,这些密钥不包含在dict1中。

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

// Add data to both dictionaries

var uniqueKeys = dict2.Keys.Except(dict1.Keys);

这就是你需要的吗?

编辑:请注意,上面的代码选择dict2中未包含在dict1中的所有键。如果您需要检查两个词典是否都有不同的键集(并且我认为它可能>),那么您可以使用:

var areTheSame = dict2.Keys.Any(x => !dict1.ContainsKey(x))
|| dict1.Keys.Any(x => !dict2.ContainsKey(x));

编辑2:OP编辑后,我现在知道你需要什么:

var differentValues = dict2.Where(pair => dict1.ContainsKey(pair.Key))
     .Select(pair => new
     {
         ValueA = pair.Value,
         ValueB = dict1[pair.Key],
         Key = pair.Key
     })
     .Where(x => x.ValueA != x.ValueB)
     .ToList();

foreach (var differentValue in differentValues)
{
    Console.WriteLine(differentValue);
}

答案 1 :(得分:2)

foreach (KeyValuePair<string, string> sourceRow in sourceData)
{
    string dumpValue;

    if (dumpData.TryGetValue(sourceRow.Key, out dumpValue) && dumpValue != sourceRow.Value)
    {
        Data_Mismatch_Criteria(sourceRow.Key, sourceRow.Value, sourceRow.Key, dumpValue);
    }
}

答案 2 :(得分:1)

好吧,这个LINQ查询将返回两个字典中都没有显示或具有不同值的记录字典:

var dictOfUniqueValues =
     dict1.Where(kv => !dict2.ContainsKey(kv.Key)).Concat(
         dict2.Where(kv => !dict1.ContainsKey(kv.Key) || dict1[kv.Key] != kv.Value))
    .ToDictionary(kv => kv.Key, kv => kv.Value);

让我们仔细看看这里发生了什么:

var dictOfUniqueValues =

     // get records from dict1 that don't exist in dict2 by comparing keys
     dict1.Where(kv => !dict2.ContainsKey(kv.Key)).Concat(

     // get records from dict2 that don't exist in dict1 by comparing keys
     // and records that do exist, but values are not equal
         dict2.Where(kv => !dict1.ContainsKey(kv.Key) || dict1[kv.Key] != kv.Value))

     // convert the resulting IEnumerable<KeyValuePair<T1, T2>> to dictionary
    .ToDictionary(kv => kv.Key, kv => kv.Value);