public static RelevantObjectCollection Merge(RelevantObjectCollection collection1,
                                                     RelevantObjectCollection collection2)
        {
            var result = new RelevantObjectCollection();

            // Merge all types in this
            foreach (var kvp in collection1)
            {
                result.Add(kvp.Key,
                           collection2.TryGetValue(kvp.Key, out var otherValue)
                        ? SortedMerge(kvp.Value, otherValue)
                        : kvp.Value);
            }
            // Add the types that only the other has
            foreach (var type in collection2.Keys.Except(collection1.Keys))
            {
                result.Add(type, collection2[type]);
            }

            return(result);
        }
        public RelevantObjectCollection GetSubset(SelectionPredicateCollection predicate, RelevantObjectsGenerator generator)
        {
            var result = new RelevantObjectCollection();

            if (predicate == null)
            {
                foreach (var kvp in this)
                {
                    result.Add(kvp.Key, kvp.Value);
                }

                return(result);
            }

            foreach (var kvp in this)
            {
                result.Add(kvp.Key, kvp.Value.Where(o => predicate.Check(o, generator)).ToList());
            }

            return(result);
        }