Проблема с поиском минимального слова в массиве, С#

Суть проблемы состоит в том, что программа, не всегда находит наименьшее слово в массиве. Работает это выборочным образом, и эту проблему я пытаюсь выяснить.

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 шт):

Автор решения: Uranus

Метод 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} символа.");
→ Ссылка