Проблема с поиском минимального слова в массиве, С#
Суть проблемы состоит в том, что программа, не всегда находит наименьшее слово в массиве. Работает это выборочным образом, и эту проблему я пытаюсь выяснить.
using System;
using System.Linq;
namespace ConsoleApp2
{
class Program
{
public static void Main(string[] args)
{
Console.Write("Введите строку: ");
string str = Console.ReadLine();
double[] numb = new double[10];
for (int i = 0; i < numb.Length; i++)
{
Random rnd = new Random();
numb[i] = rnd.Next(0, 500);
}
Program.Minimal(numb);
Program.Minimal(str);
Console.Write("Введите первый элемент последовательности: ");
int a = int.Parse(Console.ReadLine());
Console.Write("Введите второй элемент последовательности: ");
int b = int.Parse(Console.ReadLine());
Console.Write("Введите третий элемент последовательности: ");
int c = int.Parse(Console.ReadLine());
Program.Sequence(a, b, c);
}
public static void Minimal(double[] numb)
{
Console.WriteLine("Сгенерированный массив: ");
foreach (double elem in numb)
{
Console.WriteLine(elem);
}
Console.WriteLine("-------------------------------------");
Console.WriteLine();
Console.WriteLine($"Наименьший элемент массива: {numb.Min()}.");
Console.WriteLine();
}
public static void Minimal(string str)
{
string[] words = str.Split(new char[] {' '});
Console.WriteLine($"Самое кратчайшее слово - {words.Min()}, его длина составляет {words.Min().Length} символа.");
Console.WriteLine();
}
public static void Sequence(int a, int b, int c)
{
Console.WriteLine();
if (a < b && b < c)
{
Console.WriteLine("Последовательность является возрастающей!");
}
else
{
Console.WriteLine("Последовательность аргументов иного рода!");
}
}
}
}
Необходимо обратить внимание на функцию Minimal. В ней описывается поиск наименьшего слова при помощи System.Linq; (Min). Если ввести строку "один два тридцать", программа сработает верно и вернет двойку с количеством чаров, если ввести строку "один два пять десять", то функция не видит наименьшего слова.
Ответы (1 шт):
Метод Enumerable.Min использует реализацию интерфейса IComparable чтобы сравнивать элементы последовательности между собой.
Метод String.Compare опреледяет лексическое отношение между двумя строками, а не отношение их длин.
Для вашей задачи подойдет перегруженный метод Min(IEnumerable, Func<TSource,Nullable>), который позволяет задавать функцию трансформации.
int minLength = words.Min(w => w.Length);
Console.WriteLine($"Самое кратчайшее слово - {words.First(w => w.Length == minLength)}, его длина составляет {minLength} символа.");
Кстати, при помощи сортировки можно решить задачу более оптимальным образом:
string shortestWord = words.OrderBy(w => w.Length).First();
Console.WriteLine($"Самое кратчайшее слово - {shortestWord}, его длина составляет {shortestWord.Length} символа.");