Словарь Пересечение по значению
У меня есть два словарных объекта
Я пытаюсь пересечь DictA из DictB по их значениям и вернуть третий словарь с результатами
Я могу сделать это, однако это только производит список целых
var results = DictA.Values.Intersect(DictB.Values);
Этот способ очень медленный
var results = DictA.Where(x => DictB.ContainsValue(x.Value)).ToDictionary(x => x.Key, x => x.Value);
Производительность является ключевым. Каждый словарь содержит несколько миллионов записей.
Как я могу добиться пересечения 2 словарей, получая 3 словарь?
1 ответ
Я думаю, что использование словаря приведет к проблемам с производительностью, если вы будете искать значения; часть ключей словаря оптимизирована, чтобы дать вам производительность O(1); коллекция значений - это, в основном, ICollection, поэтому поиск выполняется по O(n).
Если вы перенесете значения в HashSet, ваша производительность значительно улучшится; в качестве грубого примера:
var dict1 = new Dictionary<string, string>();
var dict2 = new Dictionary<string, string>();
for (var x = 0; x < 1000000; x++)
{
dict1.Add(x.ToString(), x.ToString());
}
for (var x = 0; x < 2000000; x+=2)
{
dict2.Add(x.ToString(), x.ToString());
}
var hs1 = new HashSet<string>(dict1.Values);
var hs2 = new HashSet<string>(dict2.Values);
hs1.IntersectWith(hs2);