ProgrammatieVB.NET ontwikkelaar (databases, bedrijfslogica)

Vertel over de mechanismen voor het werken met verzamelingen zoals SortedList en SortedDictionary in Visual Basic. Wat is het verschil tussen deze verzamelingen, wat is hun specificiteit, waar moeten we op letten bij het gebruik van sleutels en waarden?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Geschiedenis van de vraag:

Verzamelingen zoals SortedList en SortedDictionary zijn geïntroduceerd in .NET voor het gemakkelijke opslaan van sleutel-waarde paren in een gesorteerde volgorde op basis van de sleutel. Ze worden gebruikt wanneer snelle toegang op sleutel belangrijk is, terwijl ook sortering wordt ondersteund.

Probleem:

Veelvoorkomende fouten hebben te maken met de verkeerde keuze tussen deze verzamelingen, het gebruik van sleutels van een ongepast type (zonder ondersteuning voor IComparable), en ook met onrealistische verwachtingen over het gedrag bij het invoegen van dubbele sleutels.

Oplossing:

In Visual Basic worden de klassen SortedList(Of TKey, TValue) en SortedDictionary(Of TKey, TValue) gebruikt voor het opslaan van gesorteerde gegevens.

Voorbeeldcode:

Dim sortedList As New SortedList(Of String, Integer)() sortedList.Add("Alex", 27) sortedList.Add("Mike", 34) Dim age As Integer = sortedList("Alex") ' 27 Dim sortedDict As New SortedDictionary(Of Integer, String)() sortedDict.Add(3, "Drie") sortedDict.Add(1, "Een") For Each pair In sortedDict Console.WriteLine(pair.Key & ": " & pair.Value) Next

Belangrijke kenmerken:

  • Sortering op sleutel, het type sleutel moet IComparable ondersteunen of een IComparer worden opgegeven bij het maken van de verzameling.
  • SortedList is geheugenbesparend bij kleine hoeveelheden, maar minder efficiënt bij frequente invoeg/bewerkingen in vergelijking met SortedDictionary.
  • Dubbele sleutels zijn niet toegestaan — bij de poging om een sleutel toe te voegen die al bestaat, wordt een uitzondering gegooid.

Misleidende vragen.

1. Is het mogelijk om sleutels van bestaande elementen in SortedList of SortedDictionary te wijzigen?

Nee, het is niet mogelijk om de sleutel van een bestaand element te wijzigen. Om een sleutel "te veranderen", moet de oorspronkelijke par worden verwijderd en een nieuwe worden toegevoegd met de gecorrigeerde sleutel.

2. Welke uitzondering wordt opgegooid bij de poging om een reeds bestaande sleutel toe te voegen?

Er wordt een ArgumentException opgegooid.

Dim sl As New SortedList(Of Integer, String)() sl.Add(1, "Een") sl.Add(1, "Herhaling") ' ArgumentException

3. Wat gebeurt er als je een type gebruikt in de sleutels dat IComparable niet implementeert?

De compiler staat toe om de verzameling te maken, maar bij de poging om het eerste element toe te voegen, zal een InvalidOperationException worden opgegooid.

Class MyObj End Class Dim sd As New SortedDictionary(Of MyObj, String)() sd.Add(New MyObj(), "test") ' Exceptie

Typische fouten en antipatterns

  • Poging om sleutels van bestaande elementen te wijzigen (onmogelijk).
  • Het toevoegen van objecten als sleutels zonder IComparable/IComparer implementatie.
  • Onverwerkte uitzondering bij het toevoegen van een dubbele sleutel.

Voorbeeld uit het leven

Negatief geval

Er werd een gebruikersregister geïmplementeerd op basis van een ID (userId — sleutel) en leeftijd (waarde) met SortedList. De sleutel was een eigen objecttype (User), dat geen IComparable implementeert. Bij het toevoegen van gebruikers treden onverwachte uitzonderingen op.

Voordelen:

  • Sortering zou handig zijn als alles zou werken.

Nadelen:

  • Het programma crasht bij de poging tot invoeging.
  • De gebruiker kan niets doen zonder aanpassing van de User-klasse.

Positief geval

Gebruik maken van SortedDictionary(Of Integer, User), waarbij de sleutel een eenvoudig type Integer (userId) is dat vergelijking ondersteunt. Alles werkt correct, er is sortering op gebruikers-ID.

Voordelen:

  • Snelle sortering en zoekopdrachten.
  • Vermijden van fouten met IComparable.

Nadelen:

  • Voor frequent verwijderen/toevoegen verbruikt SortedDictionary iets meer geheugen dan SortedList (met SortedList is invoegen trager bij grote hoeveelheden).