Неизменяемый набор in.NET
Имеет ли .NET BCL неизменяемый тип набора? Я программирую на функциональном диалекте C# и хотел бы сделать что-то вроде
new Set.UnionWith(A).UnionWith(B).UnionWith(C)
Но лучшее, что я могу найти, - это
HashSet.UnionWith, что потребует следующей последовательности вызовов: HashSet composite = new HashSet();
composite.UnionWith(A);
composite.UnionWith(B);
composite.UnionWith(C);
Это использование очень непрозрачно с точки зрения референции, что затрудняет оптимизацию и понимание. Есть ли лучший способ сделать это без написания пользовательского типа функционального набора?
3 ответов:
Обновить
Этот ответ был написан некоторое время назад, и с тех пор множество неизменяемых коллекций было введено в
System.Collections.Immutableпространство имен.Оригинальный ответ
Вы можете развернуть свой собственный метод для этого:
public static class HashSetExtensions { public static HashSet<T> Union<T>(this HashSet<T> self, HashSet<T> other) { var set = new HashSet<T>(self); // don't change the original set set.UnionWith(other); return set; } }Используйте его так:
var composite = A.Union(B).Union(C);Вы также можете использовать LINQ
Union, но чтобы получить набор, вам нужно будет передать результат в конструкторHashSet:var composite = new HashSet<string>(A.Union(B).Union(C));, но
HashSetсама является изменяемым. Вы можете попробовать использоватьнеизменяемое множество F#.Также, Как упоминалось в комментариях ErikE , использование
Concatдает тот же результат и, вероятно, работает лучше:var composite = new HashSet<string>(A.Concat(B).Concat(C));
Новые неизменяемые коллекции имеют:
ImmutableStack<T>ImmutableQueue<T>ImmutableList<T>ImmutableHashSet<T>ImmutableSortedSet<T>ImmutableDictionary<K, V>ImmutableSortedDictionary<K, V>Подробнее здесь
О Союзе этот тест проходит:
[Test] public void UnionTest() { var a = ImmutableHashSet.Create("A"); var b = ImmutableHashSet.Create("B"); var c = ImmutableHashSet.Create("C"); var d = a.Union(b).Union(c); Assert.IsTrue(ImmutableHashSet.Create("A", "B", "C").SetEquals(d)); }
Существует ReadOnlyCollection, но это не хэш-таблица. LINQ добавляет методUnion в качестве расширения.
Comments