IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Problème avec une List


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut Problème avec une List
    Bonjour

    J'ai une classe RecordList(Of T) qui hérite de List(Of T) que j'utilise pour stocker une liste de Fichiers Multimédia définit dans une classe MultiMediaFile.

    Dans une autre Class j'au une routine pour effacer un fichier par son nom qui est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub DeleteMultimediaFile(ByVal filename As String)
            Dim info As New FileInfo(filename)
            Dim file As New MultimediaFile()
            file.Database = _database
            file.Filename = filename
            file.Format = info.Extension
            _Files.RemoveAt(_Files.IndexOf(file))
     
        End Sub
    _Files est la variable locale
    A l'exécution j'obtiens une exeption car _Files.IndexOf(file) renvoit -1.
    Or file.name contient bien le nom de fichier à effacer et _Files(0).Filename est également correct.
    Je suppose donc que mon appel n'est pas bon.
    Question : comment utilise-t-on la fonction RemoveAt pour une liste tippée du genre List(Of T)?
    Merci de votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Class RecordList(Of T)
    Inherits List(Of T)
    .....
      Public Shadows Sub RemoveAt(ByVal index As Integer)
            MyBase.RemoveAt(index)
        End Sub
    Une autre Class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Public Class MultimediaFile
    	Private _database As Database
    	Private _Filename As String
    	Private _Format As String
    	Private _SourceMediaType As String
     
    	Public Sub New()
    	End Sub
     
    	Public Property Database() As GDatabase
    		Get
    			Return _database
    		End Get
    		Set
    			_database = value
    		End Set
    	End Property
     
    	Public Property Filename() As String
    		Get
    			Return _Filename
    		End Get
    		Set
    			If value <> _Filename Then
    				_Filename = value
    			End If
    		End Set
    	End Property
     
    	Public Property Format() As String
    		Get
    			Return _Format
    		End Get
    		Set
    			If value <> _Format Then
    				_Format = value
    			End If
    		End Set
    	End Property
     
    	Public Property SourceMediaType() As String
    		Get
    			Return _SourceMediaType
    		End Get
    		Set
    			If value <> _SourceMediaType Then
    				_SourceMediaType = value
    			End If
    		End Set
    	End Property
     
     
    End Class

  2. #2
    Membre régulier
    Inscrit en
    Mai 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 72
    Points : 100
    Points
    100
    Par défaut
    Bonjour BernardBouree,

    En fait c'est normal que IndexOf renvoie -1, car en effet il ne trouve pas l'élément file dans la liste car il ne sait pas comment reconnaitre que deux élément sont identique.

    Pour résoudre facilement ton problème, tu peux faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _File.RemoveAt(_File.Find(Function(m) m.Database = file.Database and m.Filename = file.Filename and m.Format = file.Format))
    Le mieux serait d'implémenter les IComparer dans ta classe MultiMediaFile afin d'écrire comment deux élément MultiMediaFile sont identique.

    Par contre de tête, je ne sais pas lesquels sont utilisé dans la méthode IndexOf.

    Une autre solution serait d'override IndexOf afin de faire toi même la recherche de l'index dans la liste de RecordList.

    Si jamais il y a qqch que tu n'as pas saisi, n'hésite pas

    Bonne journée.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Bonjour

    Merci pour l'info, je vais essayer ces méthodes proposées!

    Cordialement

    Bernard

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Bonsoir

    J'ai donc modifié mon code de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Public Sub DeleteMultimediaFile(ByVal filename As String)
            Dim info As New FileInfo(filename)
            Dim file As New GedcomMultimediaFile()
            Dim i As Integer = 0
            Dim bTrouvé As Boolean = False
            file.Database = _database
            file.Filename = filename
            file.Format = info.Extension
            For i = 0 To Files.Count - 1
                If filename = file.Filename Then
                    bTrouvé = True
                    _Files.RemoveAt(i)
                End If
            Next
            If Not bTrouvé Then
                Trace.Write("Erreur dans GedcomMultimediaRecord.DeleteMultimediaFile : Fichier " & filename & "introuvable !")
            End If
        End Sub
    Le code se passe bien mais à la sortie j'ai une exception "Erreur . la collection a été modifiée; l'opération d'énumération peut ne pas s’exécuter".

    Je suis donc passé à coté de quelque chose!
    Merci de ton aide.

    Bernard

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Bonsoir,
    tu ne peux pas supprimer un objet de ta collection pendant que tu la parcours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 0 To Files.Count - 1
                If filename = file.Filename Then
                    bTrouvé = True
                    _Files.RemoveAt(i)
                End If
            Next
    le remove doit se faire après avoir parcouru ta liste

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    A moins qu'il y ait plusieurs fichiers identiques à supprimer, ne peut-il pas simplement quitter la boucle d'énumération après avoir supprimer le fichier ?
    Kropernic

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            Dim file As New MultimediaFile
     
            For i = files.Count - 1 To 0 Step -1
                'Ici on récupère le file à la position "i"
                file = files(i)
                If file.Filename = filename Then
                    bTrouvé = True
                    files.RemoveAt(i)
                End If
            Next
    Ici en faisant une recherche inversée, c'est possible avec 1 ou plusieurs éléments à supprimer.
    Nota : je lis souvent qu'il n'est pas conseillé de modifier une liste en cours d'énumération. On conseille deux étapes, récupérer dans une liste temporaire les éléments qui nous intéressent et de les supprimer de la liste officielle ensuite?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Bonjour

    Merci pour vos précieuses réponses!
    Bernard

Discussions similaires

  1. [WD10]Problème avec une liste
    Par Louis Griffont dans le forum WinDev
    Réponses: 11
    Dernier message: 25/05/2007, 08h40
  2. Problème avec une liste chainée
    Par 0v3rb1t dans le forum C
    Réponses: 3
    Dernier message: 08/05/2007, 19h27
  3. Problème avec une liste.
    Par Baban29 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 26/04/2007, 12h12
  4. STL Problème avec une liste d'instances de class
    Par BruceBoc dans le forum SL & STL
    Réponses: 12
    Dernier message: 16/02/2007, 14h12
  5. [Débutant] problème avec une liste déroulante
    Par stan21 dans le forum Access
    Réponses: 3
    Dernier message: 12/07/2006, 14h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo