none
Tri intelligent RRS feed

  • Question

  • Bonjour,

    je me demande s'il existe un moyen en VB 2015 de trier intelligemment comme le fait Windows ?

    J'utilise : 

    Public Images As New List(Of String)

    Images.Sort()

    Merci

    jeudi 15 mars 2018 16:10

Réponses

  • Un exemple =>

    Private Class MyComparer
        Implements IComparer(Of String)
        <DllImport("Shlwapi.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
        Private Shared Function StrCmpLogicalW(ByVal psz1 As String, ByVal psz2 As String) As Integer
        End Function
        Public Function Compare(ByVal psz1 As String, ByVal psz2 As String) As Integer Implements IComparer(Of String).Compare
            Return StrCmpLogicalW(psz1, psz2)
        End Function
    End Class
    
    Dim sFilenames() As String = New String() {"Fichier 0", "Fichier 1", "Fichier 10", "Fichier 11", "Fichier 2"}
    Array.Sort(sFilenames, New MyComparer)
    MessageBox.Show(String.Join(", ", sFilenames))

    • Marqué comme réponse Mayumi56 dimanche 8 avril 2018 16:17
    jeudi 5 avril 2018 16:59
  • Salut, la ligne pose problème : 

    <DllImport("Shlwapi.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>

    J'ai mis : 

            Public Declare Function PathFileExists Lib "shlwapi" Alias "PathFileExistsA" (ByVal pszPath As String) As Long

    Mai cela ne marche pas :( 

    Fichier 2 se trouve toujours à la fin.

    Quel problème ?

    Tu as bien mis au début :

    Imports System.Runtime.InteropServices
    ?

    Et quel est le rapport avec PathFileExists  ?!

    • Marqué comme réponse Mayumi56 dimanche 8 avril 2018 16:17
    vendredi 6 avril 2018 12:28

Toutes les réponses

  • >VB 2015 de trier intelligemment comme le fait Windows ?

    WTF ?

    Il y a littéralement des centaines d'algorithme de tri, plus ou moins performants en fonction du contexte.

    Sans caractérisation très très précise du contexte, impossible de vous répondre.

    Vous lui reprochez quoi à "Sort" ???


    Paul Bacelar, Ex - MVP VC++

    jeudi 15 mars 2018 16:29
  • WTF je ne sais pas mais Windows fait ceci :

    fichier 1
    fichier 2
    ...
    fichier 10

    alors que la fonction sort() fait cela :

    fichier 1
    fichier 10
    fichier 2
    ...

    Donc, pas cool quand il s'agit de fichiers dans l'explorateur. Ce qu'affiche un listbox n'est pas comparable à l'explorateur de Windows. Je ne comprends pas pourquoi ce n'est pas natif dans VB 2015.


    mardi 20 mars 2018 18:47
  • Je parle de listbox mais la listOf String est pareille.
    mardi 20 mars 2018 18:49
  • alors que la fonction sort() fait cela :

    fichier 1
    fichier 10
    fichier 2
    ...

    C'est chose classique en développement, dans votre cas "fichier 1", "fichier 10" et "fichier 2" sont tout simplement des string et non des fichiers physiques à proprement parlé.

    Pour avoir le tri attendu, il suffit de remplacer "fichier 1" par "fichier 01" et le tour est joué, à faire de "fichier 1" jusqu'à "fichier 9"

    mercredi 21 mars 2018 08:09
  • WTF je ne sais pas mais Windows fait ceci :

    fichier 1
    fichier 2
    ...
    fichier 10

    alors que la fonction sort() fait cela :

    fichier 1
    fichier 10
    fichier 2
    ...

    Donc, pas cool quand il s'agit de fichiers dans l'explorateur. Ce qu'affiche un listbox n'est pas comparable à l'explorateur de Windows. Je ne comprends pas pourquoi ce n'est pas natif dans VB 2015.

    Windows utilise StrCmpLogicalW
    mercredi 21 mars 2018 09:40
  • Bonjour, merci pour votre aide.

    J'ai cherché et j'ai trouvé un code mais cela ne marche pas :

        Public Class MyComparer
            Implements IComparer(Of String)

            Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" (
            ByVal s1 As String,
            ByVal s2 As String) As Int32

            Public Function Compare(ByVal x As String, ByVal y As String) As Integer _
            Implements System.Collections.Generic.IComparer(Of String).Compare

                Return StrCmpLogicalW(x, y)

            End Function

        End Class

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

            Dim images As New List(Of String)()
            images.Add("Gambie")
            images.Add("Ghana")
            images.Add("Géorgie")
            images.Add("w10")
            images.Add("w2")

            images.Sort Method (T[], IComparer)
            For I = 0 To images.Count - 1
                TextBox1.Text &= images(I) & vbNewLine
            Next
        End Sub

    images.Sort Method (T[], IComparer)
    provoque une erreur :-( Merci

    jeudi 5 avril 2018 15:26
  • Un exemple =>

    Private Class MyComparer
        Implements IComparer(Of String)
        <DllImport("Shlwapi.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
        Private Shared Function StrCmpLogicalW(ByVal psz1 As String, ByVal psz2 As String) As Integer
        End Function
        Public Function Compare(ByVal psz1 As String, ByVal psz2 As String) As Integer Implements IComparer(Of String).Compare
            Return StrCmpLogicalW(psz1, psz2)
        End Function
    End Class
    
    Dim sFilenames() As String = New String() {"Fichier 0", "Fichier 1", "Fichier 10", "Fichier 11", "Fichier 2"}
    Array.Sort(sFilenames, New MyComparer)
    MessageBox.Show(String.Join(", ", sFilenames))

    • Marqué comme réponse Mayumi56 dimanche 8 avril 2018 16:17
    jeudi 5 avril 2018 16:59
  • Salut, la ligne pose problème : 

    <DllImport("Shlwapi.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>

    J'ai mis : 

            Public Declare Function PathFileExists Lib "shlwapi" Alias "PathFileExistsA" (ByVal pszPath As String) As Long

    Mai cela ne marche pas :( 

    Fichier 2 se trouve toujours à la fin.

    vendredi 6 avril 2018 11:18
  • Salut, la ligne pose problème : 

    <DllImport("Shlwapi.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>

    J'ai mis : 

            Public Declare Function PathFileExists Lib "shlwapi" Alias "PathFileExistsA" (ByVal pszPath As String) As Long

    Mai cela ne marche pas :( 

    Fichier 2 se trouve toujours à la fin.

    Quel problème ?

    Tu as bien mis au début :

    Imports System.Runtime.InteropServices
    ?

    Et quel est le rapport avec PathFileExists  ?!

    • Marqué comme réponse Mayumi56 dimanche 8 avril 2018 16:17
    vendredi 6 avril 2018 12:28
  • Ah merci ! Oui je n'avais pas mis cela. Merci énormément.
    dimanche 8 avril 2018 16:17