Member 13990723 Ответов: 3

Как получить максимальное значение этого текстового файла? (С#)


Я не уверен, что это подходящее место для подобных вопросов, но я попробую.
Моя домашняя работа состоит в том, чтобы написать код из двух основных частей: одна-создать текстовый файл с именами и числами, а другая-прочитать тот же текстовый файл и распечатать из него наибольшее число. Это та часть кода, которая создает текстовый файл (с которым я не вижу никаких проблем, он работает просто отлично), класс:
class Person
{
    public string Name;
    public string Age;
}

Главное-это:
Person a = new Person();
     Person b = new Person();
     Person c = new Person();
     a.Name = "Abel";
     a.Age = "20";
     b.Name = "Bob";
     b.Age = "22";
     c.Name = "Cain";
     c.Age = "25";
     string[] People = { a.Name, a.Age, b.Name, b.Age, c.Name, c.Age };

     using (StreamWriter write = new StreamWriter(@"C:\Users\A\Desktop\file check\test.txt"))
     {
         for (int i = 0; i < People.Length; i++)
         {
             write.WriteLine(People[i]);
         }
     }

Текстовый файл очень прост и выглядит примерно так:
Abel
20
Bob
22
Cain
25

Эта часть работает нормально. Та часть, с которой у меня возникли проблемы, - это та часть, где я должен прочитать файл и напечатать самое большое число, которое выглядит следующим образом:
string PeopleCheck = @"C:\Users\A\Desktop\file check\test.txt";
      using (StreamReader read = new StreamReader(PeopleCheck))
      {
          while (true)
          {
              string FindMax = read.ReadLine();
              if (FindMax == null)
              {
                  break;
              }
              int test;
              if(Int32.TryParse(FindMax, out test))
              {
                 // Console.WriteLine(FindMax); --> this will print all numbers, one number in each line
                  int[] numbers = FindMax.Split(' ').Select(n => Convert.ToInt32(n)).ToArray();
                  Console.WriteLine("the highest number is {0}", numbers.Max());
              }
          }
      }
  }

Я думал, что numbers.Max() выведет самое большое число, но результат выглядит так:
the highest number is 20
the highest number is 22
the highest number is 25
Press any key to continue . . .


Программа просматривает каждое число в массиве, анализирует каждое из них и выводит их как максимальное значение.
Если кто-нибудь может показать мне, как это исправить, так что печатается только максимальное значение массива, я буду очень благодарен ^^

Что я уже пробовал:

Я попытался поместить массив за пределы цикла, но тогда в массиве нет информации, поэтому я не знаю, как это исправить.
Я также попытался поместить новый массив Equals в массив 'numbers', но он должен быть в цикле, чтобы получить информацию, и выходные данные не меняются.

3 Ответов

Рейтинг:
21

SaiChanderMG

Привет,

Код Ur должен быть немного изменен, так как он не следует логике, которую вы хотите. Я просто пытаюсь изменить код ur таким образом, чтобы он следовал логике, которая вам нужна. Решение может быть более упрощенным, но я не хочу этого делать, так как оно не объясняет, чего именно вам не хватает.



старый код:
требуется модификация:
1. нужно вынуть массив за пределы цикла while, так как он будет инстанцироваться, когда когда-нибудь вы найдете число, которое нам не поможет.
2. Нет необходимости разделить на УР содержимое файла и логика у р пытается реализовать.


    using (StreamReader read = new StreamReader(PeopleCheck))
    {
        while (true)
        {
            string FindMax = read.ReadLine();
            if (FindMax == null)
            {
                break;
            }
            int test;
            if(Int32.TryParse(FindMax, out test))
            {
               // Console.WriteLine(FindMax); --> this will print all numbers, one number in each line
                int[] numbers = FindMax.Split(' ').Select(n => Convert.ToInt32(n)).ToArray();
                Console.WriteLine("the highest number is {0}", numbers.Max());
            }
        }
    }
}


измененный код:
1. Проще говоря, я инициализировал список вне цикла while.
2. Добавлены все цифры, присутствующие в файл в цикл while.
3. Напечатано максимальное количество присутствующих в списке после в то время как логика цикла.

using (StreamReader read = new StreamReader(PeopleCheck))
{
    List<int> numbers = new List<int>();

    while (true)
    {
        string FindMax = read.ReadLine();
        if (FindMax == null)
        {
            break;
        }

        int test;
        if (Int32.TryParse(FindMax, out test))
        {
            numbers.Add(test);
        }
    }

    Console.WriteLine("the highest number is {0}", numbers.Max());
}


Рейтинг:
1

Mycroft Holmes

Я бы изменил всю структуру на 3 процесса.

Запишите файл
Вместо 1 значения в строке я бы вывел человека в строке, используя запятую в качестве разделителя.

Читать файл
Затем я читал в каждой строке и использовал split, чтобы разделить имя и возраст обратно в объект person и добавить объект person в коллекцию.

Печатать максимум один объект Person
Затем просто отсортируйте коллекцию по убыванию и распечатайте от первого лица.


Рейтинг:
1

Maciej Los

Другой способ заключается в использовании В LINQ[^]:

string[] lines = File.ReadAllLines(@"fullfilename.txt");

Regex r = new Regex(@"\d", RegexOptions.ExplicitCapture);
List<Person> persons = lines
    .Where(l=>!r.Match(l).Success)
    .Zip(lines
        .Where(l=>r.Match(l).Success), (a, b) => new Person(){Name=a, Age=Convert.ToInt32(b)})
    .ToList();
//retuns the list of persons

Person oldestperson =  persons.Where(p=>p.Age==persons.Max(a=>a.Age)).SingleOrDefault();
Console.WriteLine("The oldest person is: '{0}', she's {1} years old." ,oldestperson.Name, oldestperson.Age);

Результат:
The oldest person is: 'Cain', she's 25 years old.


Для получения более подробной информации, пожалуйста, смотрите:
Как читать из текстового файла (руководство по программированию на C#) | Microsoft Docs[^]
Перечисление Регулярных Выражений (System.Text.RegularExpressions) | Майкрософт Документы[^]
Регулярное выражение.Метод Соответствия (System.Text.RegularExpressions) | Майкрософт Документы[^]
Enumerable.Zip(интерфейс IEnumerable&ЛТ;первый&ГТ;, интерфейс IEnumerable&ЛТ;TSecond&ГТ;, функция&ЛТ;первый,TSecond,становится TResult&ГТ;) Способ (Система.По LINQ) | Майкрософт Документы[^]