0

好的,所以我有一个保存在文本文件中的程序的高分列表,但我需要按升序排列它们。

这是我到目前为止的编码:

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
比利·鲍勃.......总步数:19
毕达哥拉斯......................总步数: 50
彼得潘............总移动次数: 29

这就是我想要的样子:

高于法律......................总步数:19
比利鲍勃......................总步数: 19
彼得潘............总移动数: 29
克莱德............总移动完成:32
毕达哥拉斯............总移动:50

4

1 回答 1

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
于 2013-04-25T22:07:36.077 回答