Старый вопрос
Насколько я понимаю, С# в некотором смысле имеет типы HashSet
и set
. Я понимаю, что такое HashSet
. Но почему set
это отдельное слово? Почему не каждый набор HashSet<Object>
?
Новый вопрос
Почему в C# нет универсального типа Set
, аналогичного типу Dictionary
? С моей точки зрения, я хотел бы иметь набор со стандартной производительностью поиска/добавления/удаления. Мне было бы все равно, реализовано ли это с помощью хэшей или чего-то еще. Так почему бы не создать класс набора, который фактически был бы реализован как HashSet
в этой версии C#, но, возможно, несколько иначе в будущей версии?
Или почему хотя бы не интерфейс ISet
?
Отвечать
Узнал спасибо всем, кто ответил ниже: ICollection
реализует многое из того, что вы ожидаете от ISet
. Однако, с моей точки зрения, ICollection
реализует IEnumerable
, тогда как наборы не обязательно должны быть перечисляемыми --- пример: набор действительных чисел от 1 до 2 (более того, наборы могут генерироваться динамически). Я согласен, что это незначительная тирада, поскольку «обычным программистам» редко нужны несчетные наборы.
Хорошо, думаю, я понял. HashSet
должно было называться Set
, но слово Set
в каком-то смысле зарезервировано. В частности, создатели архитектуры .NET хотели иметь согласованный набор (sic!) классов для разных языков. Это означает, что каждое имя стандартного класса не должно совпадать ни с одним ключевым словом в языках .NET. Однако слово Set
используется в VB.NET, который на самом деле нечувствителен к регистру (не так ли?), поэтому, к сожалению, здесь нет места для маневра.
Тайна раскрыта :)
Эпилог
Новый ответ Алекса Ю. ссылается на страницу MSDN, который описывает будущий интерфейс .NET 4.0 ISet
, который ведет себя почти так, как я думал, и реализован HashedSet
. Счастливый конец.
internal class Set
. источник ссылки - person Slai   schedule 21.06.2017