Matthew Morgan
Matthew Morgan

Reputation: 199

Sort a text file where each line is a name followed by a score

I'm going to make a scoreboard for an XNA game but I'm having some trouble figuring out how. The player, after finishing a level, will enter his name when prompted. His name and time will be recorder in a text file something like this:

sam 90
james 64
matthew 100

I'm trying to figure out a way to sort this data by the time taken only and not taking into account the name.

I haven't started coding this yet but if anybody can give me any ideas it would be greatly appreciated.

Upvotes: 2

Views: 4449

Answers (3)

Anders Arpi
Anders Arpi

Reputation: 8417

First, read the text file using File.ReadAllLines(...) so you get a string array. Then iterate over the array and split each string on blank space (assuming users can't enter spaces in their names) and order on the second element, which should be the score. You have to cast it into a string with int.Parse(...) to be able to order it properly.

string[] scores = File.ReadAllLines("scorefile.txt");
var orderedScores = scores.OrderByDescending(x => int.Parse(x.Split(' ')[1]));

foreach (var score in orderedScores)
{
    Console.WriteLine(score);
}
//outputs:
//matthew 100
//sam 90
//james 64

I would recommend using something like a semi-colon to separate the name and the score instead of a space, as that makes it much easier to handle in the case that users are allowed to enter spaces in their names.

Upvotes: 6

pengibot
pengibot

Reputation: 1552

Why not make this into a database file, .sdf which you can easily create on the fly if needed. Would be best for keeping track of data allowing sorting and future reuse.

SQLite is designed for this exact purpose, makes basic CRUD operations a doddle. You can also encrypt database files if your game grows and you want to start using it as a way to download/upload high scores and share scores with friends/world.

Don't get me wrong, this is definitely a little more work than simply parsing a text file, but it is future proof and you get a lot of functionality right out of the bag without having to write parsers and complex search routines etc.

XML is a definite other choice, or JSON. All 3 are all good alternatives. A plain text file probably isn't the way to go though, as in the end will probably cause you more work.

Upvotes: 2

Sri Harsha Chilakapati
Sri Harsha Chilakapati

Reputation: 11950

Create the score table as

name::score

and read every line and on it

string line = "Sam::255";
string name = line.split("::")[0];

Also do similar to the score.

Upvotes: 0

Related Questions