好的,所以我的程序的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
答案 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