Неизменяемый набор 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);


Это использование очень непрозрачно с точки зрения референции, что затрудняет оптимизацию и понимание. Есть ли лучший способ сделать это без написания пользовательского типа функционального набора?

605   3  

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

    Ничего не найдено.