Давайте поставим вопрос по-другому : мы собираемся сохранить (не удалить ) не более 5
лучших игроков.Мы должны рассмотреть, что нам следует делать в случае ничьих (т.е. 2
или более игроков имеют одинаковый счет ).Я думаю, что было бы честно оставить всех таких игроков (чтобы фактический словарь мог быть длиннее , чем 5
записей):
var newDictionary = AllNames()
.GroupBy(pair => pair.Value) // groups by scores
.OrderBy(chunk => chunk.Key) // less seconds the better
.Take(5) // at most 5 groups (ties preserved)
.SelectMany(chunk => chunk) // flatten back ("ungroup")
.ToDictionary(pair => pair.Key,
pair => pair.Value);
Toсохраните данные в файл, попробуйте File.WriteAllLines
;давайте использовать "Name Value"
формат
File.WriteAllLines(@"c:\TopPlayers.txt", newDictionary
.Select(pair => $"{pair.Key} {pair.Value}"));
Редактировать: Если нам нужно добавить пользователя, с помощью name
и score
мы можем сделать это 2
способами:
Что бы ни было score
, удалите 5
-ое место и добавьте нового пользователя:
var newDictionary = AllNames()
.GroupBy(pair => pair.Value) // groups by scores
.OrderBy(chunk => chunk.Key) // less seconds the better
.Take(4) // at most 4 groups (ties preserved)
.SelectMany(chunk => chunk) // flatten back ("ungroup")
.ToDictionary(pair => pair.Key,
pair => pair.Value);
newDictionary.Add(name, score);
Добавьте нового пользователя, затем возьмите top 5
(обратите внимание, что новый пользователь может быть исключен какболее низкий исполнитель)
var newDictionary = AllNames()
.Concat(new KeyValuePair<string, int>[] {
new KeyValuePair<string, int>(name, score)} // All new users here
)
.GroupBy(pair => pair.Value) // groups by scores
.OrderBy(chunk => chunk.Key) // less seconds the better
.Take(5) // at most 5 groups (ties preserved)
.SelectMany(chunk => chunk) // flatten back ("ungroup")
.ToDictionary(pair => pair.Key,
pair => pair.Value);
Edit 2: Таким образом, вы можете реализовать метод, такой как
private void SaveNewUser(string name, int score) {
var newDictionary = AllNames()
.GroupBy(pair => pair.Value) // groups by scores
.OrderBy(chunk => chunk.Key) // less seconds the better
.Take(4) // at most 4 groups (ties preserved)
.SelectMany(chunk => chunk) // flatten back ("ungroup")
.ToDictionary(pair => pair.Key,
pair => pair.Value);
newDictionary.Add(name, score);
File.WriteAllLines(@"c:\TopPlayers.txt", newDictionary
.Select(pair => $"{pair.Key} {pair.Value}"));
}
, который вы можете вызвать где-нибудь, скажем, нажатием кнопки:
private void saveButton_Click(object sender, EventArgs e) {
SaveNewUser(textBoxWithName.Text, int.Parse(textBoxWithScore.Text));
}