我目前有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);
}
}
}
}
答案 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);