Как сделать удаление результата игрока, если он «вылетел» из рейтинга? - PullRequest
0 голосов
/ 31 мая 2019

Мне нужно убрать плеер из словаря и из файла, если он «вылетает» из рейтинга (т.е. занимает 6-е место) У меня есть идея сделать это через Dictionary.Remove и затем перезаписать его вфайл.

Я создал алгоритм действий: прочитайте файл, удалите строку в памяти и верните содержимое в файл (перезаписать).Если файл большой, вы можете прочитать его строку для строки и создать временный файл, заменив исходный файл позже.

Вот код для сортировки их по местам, возможно, что-то поможет:

private static Dictionary<string, int> AllNames()
    {
        return File
          .ReadLines(@"C:\Users\HP\Desktop\картинки\results.txt")
          .Where(line => !string.IsNullOrWhiteSpace(line))
          .Select(item => item.Split(' '))
          .ToDictionary(items => items[0],
                        items => int.Parse(items[1]));
    }


    private void updateRatingLabels()
    {
        var tops = AllNames()
          .OrderBy(pair => pair.Value)                      
          .ThenBy(pair => pair.Key, StringComparer.Ordinal) 
          .Take(5)                                           
          .ToArray();


        for (int i = 18; i <= 22; ++i)
            Controls.Find($"label{i}", true).First().Text = "";

        for (int i = 28; i <= 32; ++i)
            Controls.Find($"label{i}", true).First().Text = "";


        for (int i = 0; i < tops.Length; ++i)
        {
            Controls.Find($"label{i + 18}", true).First().Text = tops[i].Key;
            Controls.Find($"label{i + 28}", true).First().Text = $"{tops[i].Value / 60}:{tops[i].Value % 60:00}";
        }
    }

1 Ответ

1 голос
/ 31 мая 2019

Давайте поставим вопрос по-другому : мы собираемся сохранить (не удалить ) не более 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));
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...