如何在vb.net中排列包含字符串和整数的列表?

时间:2013-04-25 20:52:50

标签: arrays vb.net sorting

好的,所以我的程序的Highscores列表保存在文本文件中,但我需要按升序排列。

以下是我迄今为止编写的代码:

WinnerName = txtName.Text
If Player1Wins = True Then
    My.Computer.FileSystem.WriteAllText("directory to my textfile, which I prefer not to disclose", _
    vbNewLine & WinnerName & "...................Total Moves made: " & PlayerOneRolls, True)
    txtList.Text = txtList.Text & vbNewLine & WinnerName & "...................Total Moves made: " & PlayerOneRolls
End If
If Player2Wins = True Then
    My.Computer.FileSystem.WriteAllText("Directory to my text file, which I prefer not to disclose", _
    vbNewLine & WinnerName & "...................Total Moves made: " & PlayerTwoRolls, True)
    txtList.Text = txtList.Text & vbNewLine & WinnerName & "...................Total Moves made: " & PlayerTwoRolls
End If

以下是我的文本文件目前的样子:

  

克莱德...................总动作:32
  以上法律...................总动作:19
  Billy Bob ...................总动作:19
  毕达哥拉斯...................总动作:50
  彼得潘...................总动作:29

这就是我想要的样子:

  

以上法律...................总动作:19
  Billy Bob ...................总动作:19
  彼得潘...................总动作:29
  克莱德...................总动作:32
  毕达哥拉斯...................总动作:50

1 个答案:

答案 0 :(得分:0)

与基于文本文件的方法保持一致,基本上将文件的每一行读入一个列表(适应文件中的标题行或我不知道的其他格式等)。然后按分数订购列表。

你可以通过将字符串分成你知道应该存在的东西来获得分数(“:”,你知道它是什么因为你把它放在那里;我的建议是使用一个变量来保存这个字符串,所以作者和读者使用相同的字符串...)然后将得分组件解析为整数 - 您可能希望根据得分范围等更改此数据类型。使用Lambda从每个字符串中提取得分以告知OrderBy如何排序。

如果某人的名字中有“:”,则使用“:”分割可能会有危险。接受建议。

Dim splitString As String = ":"
Dim scores As New List(Of String)
Using sr As New StreamReader("C:\scores.txt")
    While sr.Peek() > 0
        scores.Add(sr.ReadLine())
    End While
End Using
Dim sortedScores As List(Of String) = scores.
    OrderBy(Of Integer)(Function(arg) Integer.Parse(arg.Split(splitString).Last())).
    ToList()

编辑:正如您对答案的评论中所建议的那样,XML可能是更好的选择,因为它可以让您免于担心数据的文本格式。使用完全由此XML组成的文件:

<scores>
  <score Name="Clyde" Moves="32"/>
  <score Name="Above Law" Moves="19"/>
  <score Name="Billy Bob" Moves="19"/>
  <score Name="Pythagoras" Moves="50"/>
  <score Name="Peter Pan" Moves="29"/>
</scores>

阅读XML文件(我将其命名为scores.xml并将其放入C:\)并获取每个score节点的名称和分数。此代码以原始格式将所有内容打印到控制台,但您可以使用它执行所需的操作。

Dim xDoc As XDocument
Try
    xDoc = XDocument.Load("C:\scores.xml")
    Dim scores = From x In xDoc.Descendants("score")
                 Select New With {.Name = x.Attribute("Name"),
                                  .Moves = x.Attribute("Moves")}
    ' you need to tell OrderBy that you will sort by integer, and parse .Moves, 
    ' otherwise compiler doesn't know how to compare anonymous type .Moves
    Dim sortedScores = scores.
        OrderBy(Of Integer)(Function(arg) Integer.Parse(arg.Moves))
    For Each s In sortedScores
        Console.WriteLine("{0}...................Total Moves made: {1:0}", s.Name, s.Moves)
    Next
Catch ex As Exception
    Console.WriteLine("There was an exception: ", ex.Message)
Finally
    xDoc = Nothing
End Try