2009-09-16 3 views
5

Одна из моих самых больших проблем, связанных с переходом с Java на .Net, заключается в том, что в .NET нет интерфейса Set .Net. Я знаю, что есть библиотеки, в которые я могу пойти и скачать, но в чем причина того, что он не встроен? Есть Карты (Словарь) и Списки, но почему бы не Установить?Почему нет .Net имеет структуру данных Set?

Редактировать: Я должен пояснить, что не все используют .Net 3.5 еще - так что я более или менее со ссылкой на старых версиях .Net

ответ

8

Я думаю, что это просто упущение авторов BCL. .NET 3.5 имеет класс HashSet; для более ранних версий я рекомендую обернуть словарь < T, объект >, с нулями в поле значения, чтобы реплицировать O (1), добавить, удалить и найти время.

+1

Именно так работают реализационные реализации Java. –

3

В эти дни HashSet<T>, но, к сожалению, никакого интерфейса, о котором я знаю.

2

Возможно, аргументация состоит в том, что набор действительно представляет собой список с конкретной деталью реализации, которая ограничивает элементы в нем отличными. Поскольку отличительность списка заключается в реализации, а не в интерфейсе, интерфейс не нужен.

Как уже упоминалось, FCL имеет HashSet<T>.

+1

Вы забыли большую разницу между списками и наборами: список упорядочен, а набор нет. –

+1

Я заметил, что разработчики .Net иногда принимают чрезмерно академический подход к платформе. Постройте основные инструменты. Все остальное - это детализация реализации. –

+0

Ограничение элементов различием - это FAR из детали реализации. Это очень большая часть интерфейса для типа данных. – erikkallen

4

.NET 3.5 имеет HashSet, который выполняет все заданные операции.

+0

То, что я хотел бы знать, это то, почему он не был реализован раньше –

+0

Только команда BCL может ответить на это. Это похоже на значительное упущение для меня. – thecoop

1

Возможно, из-за образовательных соображений.

Типичный программист видит набор как волшебный контейнер, который работает независимо от того, сколько элементов в нем.

Если нет явного набора, программист вынужден выбирать из других типов, и при этом он учитывает количество элементов и соответствующую структуру данных для достижения хорошей производительности.

Просто дикая догадка.

3

Как уже отмечали другие, существует HashSet<T>, что на самом деле просто набор.

Причина, по которой он имеет «хэш» перед ним (деталь реализации набора, поскольку он использует хэши для устранения дубликатов) является becase Set является ключевым словом в VB.NET.

+0

Интересный лакомый кусочек –

5

В .NET 4.0 HashSet будет модифицирован даже для реализации нового интерфейса ISet.

2

Я также переехал с Java на .Net недавно (из-за профессиональной занятости), и я должен признать, что мои первоначальные проблемы были и в коллекциях.
В текущей версии .Net (3.5 и говорить о C#), вы должны ориентироваться на

  • ICollection
  • IList<T>
  • List<T>
  • IDictionary<TKey,TValue>
  • IEnumerable<T>

Они наиболее часто используются (надеюсь, что Бесполезный 't пропустить один)

+0

Я также использую IEnumerable в точках, когда мне нужно обобщенное перечисление без информации о типе, а также пропустить нековариацию .NET 2 generics – thecoop