Словарь Пересечение по значению

У меня есть два словарных объекта

Я пытаюсь пересечь 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);
Другие вопросы по тегам