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 :

transformer List(Of Obj) en string


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Par défaut transformer List(Of Obj) en string
    Bonjour,

    J'essai de transformer en String une List(Of Obj), LOf, tel que:
    - Les Obj soient convertis en String
    - Les items, Obj, soient séparés par des ";"

    J'ai "overrider" (c'est comme ca qu'on dit?) la méthode ToString de ma classe Obj. Et j'essaie des choses comme String.Join(LOf,";").

    Mais la méthode Join ne semble pas s'appliquer au List(Of T), j'ai aussi essayé des choses comme String.Join(CType(LOf,String()),";") mais le CType ne veut pas me convertir mes Obj dans leur forme ToString appropriée.

    Donc la seule solution "succincte" que j'ai trouvé, et que je considère un peu pompeuse c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Join(LOf.ConvertAll(OfString)(Function(o As Obj) o.ToString).ToArray, ";")
    N'y a t il pas plus simple qu'un ConvertAll avec lambda pour faire ca?

    Merci de vos idées,
    Zebrette

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join((from o as object in lof select o.tostring),";")
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Par défaut
    Merci de ta réponse pol63.
    Mais j'obtiens une erreur
    Range variable name cannot match the name of a member of the object class
    En même temps je ne connais LINQ que de nom, c'est peut être simple... peut être que je dois m'y pencher.

    [Edit1]
    Et il semblerai que même si je résoud le conflict de nom en créant une function bidon, disons PoString(), j'ai toujours un problème de conversion car le résultat de la requete LINQ est un IEnumerable(Of String) qui ne semble pas supporter la fonction join que j'essayais.

    [Edit2]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Join((From o As Object In Lof Select o.PoString).ToArray, ";")
    manquait juste le ToArray.
    Mais j'ai toujours ce conflict de nom...


    Zebrette

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Join((From aaa As Object In Lof Select aaa.PoString).ToArray, ";")
    ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Par défaut
    Lol, non, j'aurais du préciser: C'est la fonction ToString qui est en conflict, pas le nom de l'objet.

    apparement, c'est parce que la Methode ToString de mon Objet est en conflict avec la méthode ToString du Type de IEnumerable(Of Type) renvoyé par la requete Link... il vaut mieux lire ca: MSDN

    bref avec la méthode PoString ca marcherait, mais comme j'utilise ailleurs la méthode ToString de mon Objet, je suis revenu à ma solution initiale...

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour zebrette
    Tout depend comment tu as implemente ta methode toString dont on ne voit pas le code..............
    Mais voici un un exemple d'implementation qui
    1/ binde List(of Person) à un ListBox1 sans preciser ListBox1.DisplayMember ce qui oblige ListBox1 à utiliser Person.ToString .

    2/ Parcourt direct de List(of Person) et affichage de chaque element-p- en faisant appel à p.ToString .....

    3/utilise le code fourni par Pol63....

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    Public Class Form1
        Private ListPersons As List(Of Person)
        Private p As Person
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.ListPersons = New List(Of Person)
            Dim rnd As Random = New Random
     
            For i As Integer = 0 To 9
                Me.p = New Person("Paul" & (i + 1).ToString, "Michel" & (i + 1).ToString, Date.Now, rnd.NextDouble * 1000)
                Me.ListPersons.Add(p)
            Next
            Me.ListBox1.DataSource = Me.ListPersons
     
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            If Me.ListPersons IsNot Nothing Then
                For Each p As Person In Me.ListPersons
                    Me.ListBox2.Items.Add(p.ToString)
                Next
            End If
        End Sub
    End Class
    Class Person
        Public Sub New(ByVal fn As String, ByVal ln As String, ByVal bd As Date, ByVal ac As Decimal)
            m_FName = fn
            m_LName = ln
            m_Account = ac
            m_BirthDate = bd
        End Sub
        ' Expose a custom type from a bound property
        Private m_FName As String
        Public Property FName() As String
            Get
                Return m_FName
            End Get
            Set(ByVal value As String)
                m_FName = value
     
            End Set
        End Property
        Private m_LName As String
        Public Property LName() As String
            Get
                Return m_LName
            End Get
            Set(ByVal value As String)
                m_LName = value
     
            End Set
        End Property
        Private m_BirthDate As Date
        Public Property BirthDate() As Date
            Get
                Return m_BirthDate
            End Get
            Set(ByVal value As Date)
                m_BirthDate = value
     
            End Set
        End Property
        Private m_Account As Decimal
        Public Property Account() As Decimal
            Get
                Return m_Account
            End Get
            Set(ByVal value As Decimal)
                m_Account = value
     
            End Set
        End Property
        'note que les espaces inseres avant et apres le pt-virgule  
        'dans la chaine de formatage  compte
        Public Overrides Function ToString() As String
            Return String.Format("Nom :{0} ;  Prenom : {1}; Compte : {2} ; DateNaissance : {3}", Me.LName, _
           Me.LName, Me.Account, Me.BirthDate.ToShortDateString)
     
        End Function
     
    End Class
    A noter que ce qui vient d'etre dit s'applique meme si ton objet Person est "complexe" (par exemple Person comporte une prop Client ..... à condition que le class Client bien sur overrides sa methode convenablement)......les appels à toString sont fait en cascade...............
    Bon code................

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    en effet je viens de tester, c'est la première fois que je vois ce problème, linq n'aimerait pas les .ToString ...

    pour y remédier tu peux faire une autre fonction ou une readonly property sur ta classe qui return me.tostring et l'utiliser dans linq

    ou sinon tu fais comme à l'ancienne avec un for each, qui avec un stringbuilder sera certainement plus performant
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Je suis pas sur que les propriétés perso et le type déclarer "Objet" de la liste soit fortement une très bonne idée (ça devrait même pas passer le compilateur ce genre de truc).

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    oui enfin le problème venait surtout qur même en typant tout ce qu'on veut, le ToString ne passe pas

    mais sinon oui en effet il vaut mieux savoir ce qu'il y a dans le list(of ) et éventuellement filtrer sur un type et caster

    ceci dit, vb par défaut ca le dérange pas spécialement d'appeler des propriétés sur une variable as object
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    re-bonjour zebrette
    Voici le code complet du form.
    Il y a un loupe je m'excuse car j'ai dit dans mon post
    3/utilise le code fourni par Pol63....
    C'est un bouton 3 avec un listbox3 .
    Le code complet:
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    Public Class Form1
        Private ListPersons As List(Of Person)
        Private p As Person
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.ListPersons = New List(Of Person)
            Dim rnd As Random = New Random
     
            For i As Integer = 0 To 9
                Me.p = New Person("Paul" & (i + 1).ToString, "Michel" & (i + 1).ToString, Date.Now, rnd.NextDouble * 1000)
                Me.ListPersons.Add(p)
            Next
            Me.ListBox1.DataSource = Me.ListPersons
     
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            If Me.ListPersons IsNot Nothing Then
                For Each p As Person In Me.ListPersons
                    Me.ListBox2.Items.Add(p.ToString)
                Next
            End If
        End Sub
        'join((from o as object in lof select o.tostring),";")
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            'Insere un separateur de ligne VBCRLF
            'Split le tout ce qui donne un Tableau de Ligne type string 
            'Convertit le Tableau en List(of  Ligne) &  l'envoie vers le magasin datasource
            If Me.ListPersons IsNot Nothing Then
                Dim s As String = Join((From o As Object In Me.ListPersons Select p = o.ToString).ToArray, "; " & vbCrLf)
                Me.ListBox3.DataSource = s.Split(vbCrLf).ToList
            End If
     
        End Sub
    End Class
    Class Person
        Public Sub New(ByVal fn As String, ByVal ln As String, ByVal bd As Date, ByVal ac As Decimal)
            m_FName = fn
            m_LName = ln
            m_Account = ac
            m_BirthDate = bd
        End Sub
        ' Expose a custom type from a bound property
        Private m_FName As String
        Public Property FName() As String
            Get
                Return m_FName
            End Get
            Set(ByVal value As String)
                m_FName = value
     
            End Set
        End Property
        Private m_LName As String
        Public Property LName() As String
            Get
                Return m_LName
            End Get
            Set(ByVal value As String)
                m_LName = value
     
            End Set
        End Property
        Private m_BirthDate As Date
        Public Property BirthDate() As Date
            Get
                Return m_BirthDate
            End Get
            Set(ByVal value As Date)
                m_BirthDate = value
     
            End Set
        End Property
        Private m_Account As Decimal
        Public Property Account() As Decimal
            Get
                Return m_Account
            End Get
            Set(ByVal value As Decimal)
                m_Account = value
     
            End Set
        End Property
        'note que les espaces inseres avant et apres le pt-virgule  
        'dans la chaine de formatage  compte
        Public Overrides Function ToString() As String
            Return String.Format("Nom :{0} ;  Prenom : {1}; Compte : {2} ; DateNaissance : {3}", Me.LName, _
           Me.LName, Me.Account, Me.BirthDate.ToShortDateString)
     
        End Function
     
    End Class
    bon code...........

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Par défaut
    Je ne pensais pas déchainer les experts...

    Mais pour résumer:
    1. ma méthode du tout début fonctionne, même si elle n'est pas la plus performante
    2. LINQ permet de faire plus court, comme pol63 le suggère, mais il y à un conflict sur la méthode ToString()
    3. Je pourrais créer une propriété readonly sur mon objet ou un équivalent de la méthode ToString() (je proposais naïvement PoString()) mais le but initial étant de réduire au minimum le code, rajouter une propriété n'est pas souhaité
    4.Mabrouki propose de taper la requete LINQ sans typer l'objet de la requete, et ca marche!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Join((From o As Object In Me.ListPersons Select p = o.ToString).ToArray, "; " & vbCrLf)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Join((From o As CustomObject In Me.ListPersons Select p = o.ToString).ToArray, "; " & vbCrLf)
    +1 pour Mabrouki je crois.

    question bonus: qu'est ce qui est le plus performant? la version avec Lambda ou la requete LINQ?

    Merci à tous

  12. #12
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    le plus performant comme je l'ai dit est un for each manuel avec un stringbuilder (enfin peut etre que le join utilise un stringbuilder si c'est bien fait)
    et il y a aussi le .toarray qui duplique la collection pour rien

    néanmoins il n'est pas toujours utile d'aller au plus performant, pour 100 lignes à concaténer on peut aller vers ce qui va le plus vite à coder et qui prend le moins de lignes pour plus de lisibilité, entre 0,2 et 0,5 ms l'utilisateur ne verra pas la différence

    et on est pas déchainé là, des fois on 6 et y a du sang partout
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. transformer liste en string puis en liste et ne lire que 1 element sur 2
    Par cedric190985 dans le forum Général Python
    Réponses: 5
    Dernier message: 26/03/2010, 15h02
  2. Transformer un objet JS en String
    Par FremyCompany dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/03/2006, 14h42
  3. [XSLT][.NET] Transformer du XML dans un string
    Par Floyd dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/10/2005, 15h41
  4. [C#] transformer un XmlDocument en une string
    Par kaboume dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/06/2005, 11h49
  5. [DEBUTANT] Transformer une variable Double en STring
    Par Battosaiii dans le forum Langage
    Réponses: 6
    Dernier message: 13/06/2005, 16h43

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