Почему не там интерфейс “набора” в платформе.NET?

Я думаю конкретно об универсальном классе HashSet<T>. Это реализует несколько интерфейсов, но ни один не выставляет корректную семантику набора. А именно, ни один не поддерживает Add возврат метода bool. (ICollection<T> поддержки void Add, который может использоваться в повышении.) Также неподдерживаемый этими интерфейсами операции единого набора как объединения и пересечения. (Хотя нужно сказать, что некоторые из этих операций доступны через расширения IEnumerable<T>.)

Это означает, что класс может только использоваться как набор с его прямой реализацией. Т.е. Вы не можете сделать чего-то вроде этого:

ISet<int> = new HashSet<int>;

Не насколько я знаю, так или иначе. Таким образом, что мотивировало выбор пропустить это?

Возможно, самая важная вещь - это: даже если можно бросить HashSet<T> кому: ICollection<T> и др. Вы теряете семантическое значение в API, который Вы выставляете. Таким образом, у потребителей Вашего API нет признака, они работают с набором. Таким образом, в то время как Вы могли звонить ICollection<T>.Add и продвиньтесь, люди будут смущены, если они попытаются добавить объект дважды, и он не работает. Интерфейс набора дал бы людям правильные ожидания.

5
задан Sean Devlin 4 February 2010 в 13:27
поделиться

2 ответа

Хотя я не уверен, почему он не вошел в библиотеку базовых классов ранее, ISet доступен в .NET 4.0, который находится всего в нескольких неделях от поставки. Интерфейс имеет большинство методов, которые вы ожидаете от набора. Вот некоторые из поддерживаемых методов:

  • Add, Clear, Contains, CopyTo, GetEnumerator, Remove (унаследовано)
  • ExceptWith
  • IntersectWith
  • IsSubsetOf
  • IsSupersetOf
  • Overlaps
  • UnionWith

Коллекции HashSet и SortedSet реализуют этот новый интерфейс.

8
ответ дан 14 December 2019 в 04:37
поделиться

Ознакомьтесь с Iesi.Collections.ISet , в котором добавлены функции, отсутствующие в стандартной библиотеке.

0
ответ дан 14 December 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: