2013-04-25 76 views
0

好的,所以我有一個保存在文本文件中的程序的高分列表,但我需要按升序排列它們。如何在vb.net中安排包含字符串和整數的列表?

這裏,我已經走到這一步,因爲它的編碼:

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
比利鮑勃...................總動作狂e:19
畢達哥拉斯...................總動作:50
彼得潘................ ...總移到發:29

這就是我想要它看起來像:

上述法律................ ...總動作:19
比利鮑勃...................總動作:19
彼得潘.......... .........總動幅:29
克萊德...................總移動數:32
畢達哥拉斯...................移動總數製作:50

+0

你用什麼標準來進行你想要的排序? – Melanie 2013-04-25 21:05:54

+2

您是否堅定使用txt文件?對於中間存儲,我會推薦像XML這樣的東西。然後,您可以通過代碼輕鬆訂購任何產品,並按照您的要求獲得結果。 – Neolisk 2013-04-25 22:09:39

回答

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 
相關問題