【问题标题】:How can I sort a List by megapixel and then by name?如何按百万像素然后按名称对列表进行排序?
【发布时间】:2021-05-05 02:16:58
【问题描述】:

前段时间,我在VB.Net中写了一个程序,它与我们熟悉的Windows图像查看器类似,但还有一些优点。今天我想进一步开发程序,另外还可以根据图像尺寸(即百万像素)进行排序,并且图像按此顺序(降序)显示。 所以我关心的是:我怎样才能按百万像素然后按名称排序?我对列表和它们的排序命令还不是很擅长。 我编写了一个名为“图像属性”的单独类。在这里,对于每个图像,传输完整的路径和尺寸,并计算百万像素。

Form_Main 中的代码

Imports Microsoft.WindowsAPICodePack.Dialogs
Public NotInheritable Class Form_Main
    Private Shared Form2 As Form_Anzeige
    ''' <summary>
    ''' List with file names
    ''' </summary>
    Public Liste_mit_Dateinamen As List(Of String)
    Private ReadOnly Deu As New System.Globalization.CultureInfo("de-DE")
    ''' <summary>
    ''' List with instances of the class Bildeigenschaften (image properties)
    ''' </summary>
    Private Liste_Klasse_Bildeigenschaften As New List(Of Bildeigenschaften)
    Private Sub Form_Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim Screens As Screen() = Screen.AllScreens
        If Screens.Length = 1 AndAlso (Screens(0).Bounds.Width < 1920 OrElse Screens(0).Bounds.Height < 1080) Then
            MessageBox.Show($"Es wurde kein zweiter Bildschirm angeschlossen und der erste hat eine zu kleine Auflösung{Environment.NewLine}(1920 × 1080 wäre nötig).", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return
        End If
    End Sub

    Private Sub Button_Start_Click(sender As Object, e As EventArgs) Handles Button_Start.Click
        Dim path_to_folder As String = ""
        Using OFolderD As New CommonOpenFileDialog
            OFolderD.Title = "Ordner auswählen"
            OFolderD.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
            OFolderD.IsFolderPicker = True
            If OFolderD.ShowDialog() = CommonFileDialogResult.Ok Then
                path_to_folder = OFolderD.FileName
            Else
                Return
            End If
        End Using

        Dim Liste_FI As New List(Of IO.FileInfo)
        Dim DI As IO.DirectoryInfo = My.Computer.FileSystem.GetDirectoryInfo(path_to_folder)
        Dim ExtensionList As List(Of String) = New List(Of String) From {".jpg", ".jpeg", ".bmp", ".png"}

        For Each File As IO.FileInfo In DI.GetFiles
            If ExtensionList.Contains(File.Extension.ToLower(Deu)) Then
                Liste_FI.Add(File)
                Using temp_Bmp As New Bitmap(File.FullName)
                    Liste_Klasse_Bildeigenschaften.Add(New Bildeigenschaften(CUInt(temp_Bmp.Width), CUInt(temp_Bmp.Height), File.Name))
                End Using
            End If
        Next

        If Liste_FI.Count = 0 Then
            MessageBox.Show("In dem gewählten Ordner befinden sich keine Bilder (jpg, bmp, png).", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return
        End If

        Liste_mit_Dateinamen = New List(Of String)

        If RadioButton1.Checked Then
            Dim query As IEnumerable(Of IO.FileInfo) = Liste_FI.OrderBy(Function(Info As IO.FileInfo) Info.CreationTime)
            For Each fi As IO.FileInfo In query
                Liste_mit_Dateinamen.Add(fi.FullName)
            Next
        End If
        If RadioButton2.Checked Then
            Dim query As IEnumerable(Of IO.FileInfo) = Liste_FI.OrderBy(Function(Info As IO.FileInfo) Info.Name)
            For Each fi As IO.FileInfo In query
                Liste_mit_Dateinamen.Add(fi.FullName)
            Next
        End If
        If RadioButton3.Checked Then
'              here
        End If

        'Nicht-modaler Dialog auf großem Bildschirm (mind. 1920 × 1080). Benutzer soll Form2 nach Belieben (irgendwann) wegklicken.
        'non-modal dialog on large screen (at least 1920 × 1080). User can close Form2 at will (at some point). 
        Form2 = New Form_Anzeige
        If Not Form2.Visible AndAlso Not Form2.IsDisposed AndAlso Liste_mit_Dateinamen.Count > 0 Then
            Form2.Show(Me)
            Button_Start.Enabled = False
        
        End If
    End Sub

    Private Sub Button_Stop_Click(sender As Object, e As EventArgs) Handles Button_Stop.Click
        If Form2 IsNot Nothing Then
            Form2.Timer1.Stop()
        End If
    End Sub
End Class

“Bildeigenschaften”类代码(“图像属性”)

NotInheritable Class Bildeigenschaften
    Private Megapixels As UInt32
    Private Path_to_the_file As String = ""
    Public Sub New(ByVal _width As UInt32, ByVal _height As UInt32, ByVal _path As String)
        Me.Megapixels = _width * _height
        Me.Path_to_the_file = _path
    End Sub
End Class

【问题讨论】:

    标签: vb.net sorting visual-studio-2019 .net-4.7.2


    【解决方案1】:

    例如

    Public Class Thing
    
        Public Property First As String
        Public Property Second As String
    
    End Class
    
    Dim things As New List(Of Thing)
    
    '...
    
    things.Sort(Function(t1, t2)
                    Dim result = t1.First.CompareTo(t2.First)
    
                    If result = 0 Then
                        result = t1.Second.CompareTo(t2.Second)
                    End If
    
                    Return result
                End Function)
    

    该代码使用List(Of T).Sort(Comparison(Of T)) 方法。还有其他特定的排序方式,但它们都依赖于类似的原则,即重复比较成对的项目以产生代表它们相对大小的 Integer 值。在这样的比较中,小于零的值意味着第一项小于第一项,大于零的值意味着第二项小于第一项,零意味着它们相等。这就是为什么在这段代码中,当且仅当比较第一个属性的结果为零时,才会比较第二个属性。

    有关比较和排序方法的更多信息,请参阅我的博文here。请注意,该帖子分为三个部分。

    【讨论】:

    • 感谢您提供的一般示例,真的,我会打印出来的。一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多