Dlaczego HashSet, ale nie jest ustawiony w C #?
Moje rozumienie jest takie, że C # ma w pewnym sensieHashSet
iset
typy. Rozumiem coHashSet
jest. Ale dlaczegoset
to osobne słowo? Dlaczego nie każdy zestaw jestHashSet<Object>
?
Dlaczego C # nie ma ogólnegoSet
typ, podobny doDictionary
rodzaj? Z mojego punktu widzenia chciałbym mieć zestaw ze standardową wydajnością wyszukiwania / dodawania / usuwania. Nie przejmowałbym się zbytnio, czy jest to realizowane za pomocą haszy czy czegoś innego. Dlaczego więc nie utworzyć klasy, która w rzeczywistości zostałaby zaimplementowana jakoHashSet
w tej wersji C #, ale może nieco innej w przyszłej wersji?
Albo dlaczego nie przynajmniej interfejsISet
?
Nauczyłem się dzięki wszystkim, którzy odpowiedzieli poniżej:ICollection
implementuje wiele z tego, czego można się spodziewaćISet
. Z mojego punktu widzeniaICollection
narzędziaIEnumerable
podczas gdy zestawy nie muszą być wyliczalne --- przykład: zbiór liczb rzeczywistych od 1 do 2 (nawet więcej, zestawy mogą być generowane dynamicznie). Zgadzam się, że jest to drobny argument, ponieważ „normalni programiści” rzadko potrzebują niezliczonych zestawów.
Ok, myślę, że to rozumiem.HashSet
absolutnie miał być nazywanySet
ale słowoSet
jest w pewnym sensie zarezerwowany. Dokładniej, twórcy architektury .NET chcieli mieć spójny zestaw (sic!) Klas dla różnych języków. Oznacza to, że każda nazwa klasy standardowej nie może pokrywać się z żadnym słowem kluczowym w językach .NET. SłowoSet
jest jednak używany w VB.NET, który jest niewrażliwy na wielkość liter (czy to?), niestety nie ma tam miejsca na manewry.
Zagadka rozwiązana :)
EpilogNowa odpowiedź Alexa Y. łączy się zStrona MSDN który opisuje nadchodzący interfejs .NET 4.0ISet
który zachowuje się tak, jak myślałem, że powinien i jest realizowany przezHashedSet
. Szczęśliwe zakończenie.