none
List 排列問題 (vb) RRS feed

  • 問題

  • 假設我在list建立了兩個類別 ex :水果名稱和數量,那我要如何使用數量當基準值進行排列呢

    Public Class Form1
        Structure fruit
            Dim name As String : Dim count As Integer
        End Structure
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim fruit1 As fruit
            Dim frulist As New List(Of fruit)()
            Dim ofd As New OpenFileDialog
            Dim dataread() As String
            If ofd.ShowDialog = DialogResult.OK Then
                dataread = File.ReadAllText(ofd.FileName).Split("、", 999, StringSplitOptions.RemoveEmptyEntries)
            End If
            Dim temp As String
            Dim index As Integer
            Array.Sort(dataread)
            temp = dataread(0)
            For i = 0 To dataread.Length - 1
                If temp <> dataread(i) Then
                    fruit1.name = temp
                    fruit1.count = i + 1 - index
                    frulist.Add(fruit1)
                    index = i + 1
                    temp = dataread(i)
                End If
            Next
        End Sub
    End Class

    • 已編輯 willyaa 2019年11月22日 上午 02:55
    2019年11月22日 上午 02:12

解答

  • 沒有仔細測試, 如果是要得到  frulist  以數量由小到大排序的結果的話,大概是這樣

     Dim sortResult As IEnumerable(Of fruit) = (frulist.OrderBy(Function(x)
                                                                           Return x.count
                                                                       End Function))


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 willyaa 2019年11月22日 下午 12:26
    2019年11月22日 上午 10:10
    版主
  • 兩種方式給你參考 (很久沒寫 VB,可能不甚完美)

    Module Module1 Sub Main()

    Dim source As String = "蘋果、香蕉、香蕉、西瓜、鳳梨、百香果、香蕉、西瓜、香蕉、鳳梨、番茄、百香果、香蕉、西瓜、蘋果、百香果、西瓜、香蕉、鳳梨、西瓜、鳳梨" Dim array As String() = source.Split("、") For Each item As fruit In ByLinq(array) Console.WriteLine(String.Format("{0} ,{1}", item.name, item.count)) Next Console.WriteLine("=========================") For Each item As fruit In ByListSort(array) Console.WriteLine(String.Format("{0} ,{1}", item.name, item.count)) Next Console.ReadLine() End Sub ''' <summary> ''' 直接使用 linq ''' </summary> ''' <param name="value"></param> ''' <returns></returns> Function ByLinq(ByRef value As String()) As IEnumerable(Of fruit) Return value.GroupBy(Function(x) x).Select(Function(y) New fruit With {.name = y.Key, .count = y.Count()}).OrderBy(Function(z) z.count) End Function ''' <summary> ''' 先用 linq 整理資料, 用 List.Sort 排序 ''' </summary> ''' <param name="value"></param> ''' <returns></returns> Function ByListSort(ByRef value As String()) As List(Of fruit) Dim list As List(Of fruit) = value.GroupBy(Function(x) x).Select(Function(y) New fruit With {.name = y.Key, .count = y.Count()}).ToList() list.Sort(New FruitComparer()) Return list End Function End Module Class FruitComparer Implements IComparer(Of fruit) Public Function Compare(x As fruit, y As fruit) As Integer Implements IComparer(Of fruit).Compare Return x.count - y.count End Function End Class

    Structure fruit Dim name As String : Dim count As Integer End Structure



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2019年11月22日 下午 01:00
    版主

所有回覆

  • 沒有仔細測試, 如果是要得到  frulist  以數量由小到大排序的結果的話,大概是這樣

     Dim sortResult As IEnumerable(Of fruit) = (frulist.OrderBy(Function(x)
                                                                           Return x.count
                                                                       End Function))


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 willyaa 2019年11月22日 下午 12:26
    2019年11月22日 上午 10:10
    版主
  • 輸出結果有錯

    2019年11月22日 上午 10:54
  • 怎麼個錯法? 列出完整程式和結果來瞧瞧

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年11月22日 上午 11:30
    版主
  •  Structure fruit
            Dim name As String : Dim count As Integer
        End Structure
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim fruit1 As fruit
            Dim frulist As New List(Of fruit)()
            Dim ofd As New OpenFileDialog
            Dim dataread() As String
            If ofd.ShowDialog = DialogResult.OK Then
                dataread = File.ReadAllText(ofd.FileName).Split("、", 999, StringSplitOptions.RemoveEmptyEntries)
            End If
            Dim temp As String
            Dim index As Integer
            Array.Sort(dataread)
            temp = dataread(0)
            For i = 0 To dataread.Length - 1
                If temp <> dataread(i) Then
                    fruit1.name = temp
                    fruit1.count = i + 1 - index
                    frulist.Add(fruit1)
                    index = i + 1
                    temp = dataread(i)
                End If
            Next
            Dim sortResult As IEnumerable(Of fruit) = (frulist.OrderBy(Function(x)
                                                                           Return x.count
                                                                       End Function))
            For Each i As fruit In frulist
                Debug.WriteLine(i.name)
            Next

        End Sub
    End Class

     測資: 蘋果、香蕉、香蕉、西瓜、鳳梨、百香果、香蕉、西瓜、香蕉、鳳梨、番茄、百香果、香蕉、西瓜、蘋果、百香果、西瓜、香蕉、鳳梨、西瓜、鳳梨

    輸出:

    蘋果
    百香果
    西瓜
    香蕉
    番茄
    鳳梨

    2019年11月22日 上午 11:33
  • 對於結果, 你應該 foreach 的對象是 sortResult。

    原始的 frulist 是不改變的。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年11月22日 下午 12:11
    版主
  • 原來是這樣,感謝你


    • 已編輯 willyaa 2019年11月22日 下午 12:29
    2019年11月22日 下午 12:29
  • 我剛才在找解題方法時,找到同樣解這類問題的方法compare to,可是我實作起來有點問題,請問你可以以這題來示範給我看嗎?
    2019年11月22日 下午 12:29
  • 兩種方式給你參考 (很久沒寫 VB,可能不甚完美)

    Module Module1 Sub Main()

    Dim source As String = "蘋果、香蕉、香蕉、西瓜、鳳梨、百香果、香蕉、西瓜、香蕉、鳳梨、番茄、百香果、香蕉、西瓜、蘋果、百香果、西瓜、香蕉、鳳梨、西瓜、鳳梨" Dim array As String() = source.Split("、") For Each item As fruit In ByLinq(array) Console.WriteLine(String.Format("{0} ,{1}", item.name, item.count)) Next Console.WriteLine("=========================") For Each item As fruit In ByListSort(array) Console.WriteLine(String.Format("{0} ,{1}", item.name, item.count)) Next Console.ReadLine() End Sub ''' <summary> ''' 直接使用 linq ''' </summary> ''' <param name="value"></param> ''' <returns></returns> Function ByLinq(ByRef value As String()) As IEnumerable(Of fruit) Return value.GroupBy(Function(x) x).Select(Function(y) New fruit With {.name = y.Key, .count = y.Count()}).OrderBy(Function(z) z.count) End Function ''' <summary> ''' 先用 linq 整理資料, 用 List.Sort 排序 ''' </summary> ''' <param name="value"></param> ''' <returns></returns> Function ByListSort(ByRef value As String()) As List(Of fruit) Dim list As List(Of fruit) = value.GroupBy(Function(x) x).Select(Function(y) New fruit With {.name = y.Key, .count = y.Count()}).ToList() list.Sort(New FruitComparer()) Return list End Function End Module Class FruitComparer Implements IComparer(Of fruit) Public Function Compare(x As fruit, y As fruit) As Integer Implements IComparer(Of fruit).Compare Return x.count - y.count End Function End Class

    Structure fruit Dim name As String : Dim count As Integer End Structure



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2019年11月22日 下午 01:00
    版主