I am creating a score system which reads/writes to a text file. My current format reads each line of the file and stores each line into a List<string>
. A typical line would be something like 50:James (50 being the score, James being the username)
.
I need to order the list by the score while keeping the name with the string. Here's an example of what I mean:
Unordered text file:
50:James
23:Jessica
70:Ricky
70:Dodger
50:Eric
(Notice how there are some scores that are the same, hindering my use of creating a list using numerical keys)
Ordered List:
70:Dodger
70:Ricky
50:Eric
50:James
23:Jessica
My current code (That does NOT work with two or more of the same score)
Dictionary<int, string> scoreLines = new Dictionary<int, string>();
if (!File.Exists(scorePath))
{
File.WriteAllText(scorePath, "No Scores", System.Text.Encoding.ASCII);
}
StreamReader streamReader = new StreamReader(resourcePath + "\\scoreboard.txt");
int failedLines = 0;
while (failedLines < 3)
{
string line = streamReader.ReadLine();
if (String.IsNullOrEmpty(line))
{
failedLines++;
continue;
}
scoreLines.Add(int.Parse(line.Split(':')[0]), line.Split(':')[1]);
}
var arr = scoreLines.Keys.ToArray();
arr = (from a in arr orderby a descending select a).ToArray();
List<string> sortedScoreLines = new List<string>();
foreach (int keyNum in arr)
{
sortedScoreLines.Add(keyNum + ":" + scoreLines[keyNum]);
}
return sortedScoreLines;
Yes, I know this is TERRIBLY inefficient and ugly, but I spent ages trying so many different methods.
You can use String.Split
:
var ordered = list.Select(s => new { Str = s, Split = s.Split(':') })
.OrderByDescending(x => int.Parse(x.Split[0]))
.ThenBy(x => x.Split[1])
.Select(x => x.Str)
.ToList();
Edit: Here's a demo with your data on Ideone: http://ideone.com/gtRYO7
You can use the ReadAllLines
method to easily read the file, then OrderByDescending
to sort the strings on values that you parse from them:
string[] sortedScoreLines =
File.ReadAllLines(resourcePath + "\\scoreboard.txt")
.OrderByDescending(s => Int32.Parse(s.Substring(0, s.IndexOf(':'))))
.ThenBy(s => s)
.ToArray();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With