5 votes

Comment définir une collection en .NET afin de pouvoir référencer des éléments soit par valeur, soit par nom

Je définis souvent une classe et je définis également une autre classe qui est simplement une collection de l'autre classe. Pour ce faire, j'ai trouvé qu'il était plus facile de définir l'autre classe comme Inherits List(Of Type). La raison pour laquelle je définis une classe de collection est d'ajouter des fonctionnalités supplémentaires à la collection. Prenez par exemple le code suivant.

Class Car
    Property Name As String
    Property Year As Short
    Property Model As String

Class CarCollection
    Inherits List(Of Car)

    Overloads Sub Add(ByVal Name As String, ByVal Year As Short, ByVal Model As String)
        Dim c As New Car

        c.Name = Name
        c.Year = Year
        c.Model = Model

        Add(c)
    End Sub

Si je déclare maintenant une variable CarCollection, comment puis-je faire référence à la Car soit par son nom, soit par la valeur de l'index, de la même manière que le fait .NET avec les collections. Prenons par exemple ToolStripItemCollection de .NET. Vous pouvez faire référence aux éléments qu'il contient de l'une de ces deux manières : MyCollection(2) MyCollection("MyItemName")

Ma question bien sûr est de savoir comment je peux définir ma propre collection pour pouvoir y faire référence par index ou nom de cette façon. Pour le moment, je ne peux y faire référence que par index.

6voto

Mark Cidade Points 53945

Vous pouvez utiliser un KeyedCollection :

Imports System.Collections.ObjectModel

Public Class CarCollection
    Inherits KeyedCollection(Of String, Car)

    Protected Overrides Function GetKeyForItem(ByVal item As Car) As String
        Return item.Name
    End Function
End Class

3voto

minitech Points 87225

Vous pouvez surcharger l'élément :

'''
'''Obtient ou définit un objet Car par nom.
'''
Public Default Property Item(ByVal name As String) As Car
     Get
           'Renvoie la voiture avec le nom spécifié
     End Get
     Set(ByVal value As Car)
           'Définit la voiture avec le nom spécifié
     End Set
End Property

1voto

paquetp Points 1286

Vous pourriez essayer d'hériter de System.Collections.Generic.Dictionary au lieu de List, et lorsque vous ajoutez, définissez également la clé.

1voto

BrandonZeider Points 4692

Donnez un coup d'œil au SortedDictionary ... quelque chose comme ceci:

Public Class Car
    Property Name As String
End Class

Public Class CarCollection
    Inherits SortedDictionary(Of String, Car)

    'Étendez, remplacez au besoin, en ajoutant votre propriété d'indexeur

    Public Default ReadOnly Property Item(index As Integer) As Car
        Get
            Return Me.Values.ElementAt(index)
        End Get
    End Property

End Class  

Ensuite, vous pouvez l'utiliser comme ceci:

Dim collection As New CarCollection()
collection.Add("VotreNomIci", New Car())

collection("VotreNomIci")

0voto

Jim Mischel Points 68586

La collection System.Collections.Generic.SortedList vous permet d'accéder aux éléments par index (grâce aux propriétés Keys et Values), et par clé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X