У меня есть словарь с HashSet как значение. У меня есть int [] с ключами, для которых я хочу получить Count общих значений в HashSet.C# Словарь с HashSet <int> как значение получить пересечение всех
Вот фрагмент кода, который работает очень неэффективно, так как требуется создать HashSet и изменить его в памяти перед окончательным Count.
Dictionary<int, HashSet<int>> d = new Dictionary<int, HashSet<int>>();
HashSet<int> s1 = new HashSet<int>() { 3, 4, 5, 6, 7, 8, 9 };
HashSet<int> s2 = new HashSet<int>() { 1, 2, 3, 4, 5, 8 };
HashSet<int> s3 = new HashSet<int>() { 1, 3, 5, 10, 15, 20 };
HashSet<int> s4 = new HashSet<int>() { 1, 20 };
d.Add(10, s1);
d.Add(15, s2);
d.Add(20, s3);
d.Add(25, s4);
// List of keys from which I need the intersection of the HashSet's
int[] l = new int[3] { 10, 15, 20 };
// Get an IEnumerator with the HashSet from the values of the selected Dictionary entries (10,15,20 selects s1, s2 and s3)
var hashlist = d.Where(x => l.Contains(x.Key));
// Create a new HashSet to contain the intersection of all the HashSet's
HashSet<int> first = new HashSet<int>(hashlist.First().Value);
foreach (var hash in hashlist.Skip(1))
first.IntersectWith(hash.Value);
// Show the number of common int's
Console.WriteLine("Common elements: {0}", first.Count);
То, что я ищу, это эффективный способ (LinQ возможно?) Для подсчета общих элементов без необходимости создавать новый HashSet, как я бегу аналогичного кода сотню миллионов раз.
Также важно отметить, что я создаю новый HashSet для получения пересечений, поскольку я не хочу изменять исходный набор HashSet.
Лучшие regargs, Jorge
Если вы использовали LinQ, единственное, что он собирается сделать, это создать HashSet за кулисами, чтобы сделать это, на самом деле он, скорее всего, будет более неэффективным, потому что ему нужно будет создать новый набор для каждого шага объединения. –
У вас в настоящее время проблема с производительностью? – Enigmativity
У вас есть диапазон, который, как вы знаете, всегда есть? – konkked