Ошибка в методе, который находит в тексте наименьшие и наибольшие слова
Программа исправно ищет наибольшее и наименьшее слово, но когда я решил добавить поиск всех больших слов (т.е. если слово = по длине наибольшему, то оно тоже выписывается), заметил, что программа делает больше циклов, чем вводится слов в массив. В чем моя ошибка? Я просто не понимаю, почему цикл работает больше раз, чем кол-во слов, которое я ввожу
static void Main(string[] args)
{
string minWord = "";
string maxWord = "";
int min = 999999;
int max = 0;
string text = Console.ReadLine();
text = text.Trim();
Console.WriteLine($"Min word: {GetWord(text).Item1}\nMax word: {GetWord(text).Item2}");
Console.ReadKey();
(string, string) GetWord(string word)
{
string[] Arr = word.Split(' ', ',', '.');
for (int i = 0; i < Arr.Length; i++)
{
if (Arr[i].Length < min)
{
min = Arr[i].Length;
minWord = Convert.ToString(Arr[i]);
}
else if (Arr[i].Length == max)
{
maxWord = maxWord + " " + Arr[i];
}
else if (Arr[i].Length > max)
{
max = Arr[i].Length;
maxWord = Convert.ToString(Arr[i]);
}
}
return (minWord, maxWord);
}
Ответы (2 шт):
Вы написали какой-то велосипед.
Советую использовать более легкий и, главное, понятный способ.
В коде ниже используеться LINQ метод Order By:
(string, string) GetWord(string word)
{
var arr = word.Split(' ', ',', '.');
var orderedArr = arr.OrderBy(w => w.Length).ToList();
return (orderedArr.First(), orderedArr.Last());
}
Мне кажется, что за "лишние итерации" вы принимаете второй вызов GetText:
Console.WriteLine($"Min word: {GetWord(text).Item1}\nMax word: {GetWord(text).Item2}");
В результате для максимального слова вы получаете удвоенную строку - ведь строка maxWord находится за пределами функции GetText...
Перенесите переменные в GetText, и все получится:
(string, string) GetWord(string word)
{
string minWord = "";
string maxWord = "";
int min = 999999;
int max = 0;
string[] Arr = word.Split(' ', ',', '.');
for (int i = 0; i < Arr.Length; i++)
...
Пусть и неэффективно. Но лучше бы второго вызова GetText и вовсе избежать:
var (m, M) = GetWord(text);
Console.WriteLine($"Min word: {m}\nMax word: {M}");
Update
К комментарию об инициализации минимального/максимального значений — можно сделать так:
(string, string) GetWord(string word)
{
string[] Arr = word.Split(' ', ',', '.');
string minWord = Arr[0], maxWord = Arr[0];
int min = Arr[0].Length;
int max = Arr[0].Length;
for (int i = 1; i < Arr.Length; i++)
{
....