В этом посте будет обсуждаться, как найти минимальное и максимальное число из массива в C#.
1. Использование Linq
Простое решение для поиска минимального и максимального значения в последовательности значений — использование Enumerable.Min
а также Enumerable.Max
методы из System.Linq
пространство имен.
using System; using System.Linq; public class Example { public static void Main() { int[] arr = { 8, 3, 5, –1, 2 }; Console.WriteLine(“Minimum number is “ + arr.Min()); Console.WriteLine(“Maximum number is “ + arr.Max()); } } |
Скачать Выполнить код
результат:
Minimum number is -1
Maximum number is 8
2. Использование Array.Sort()
Метод
Другой вероятный, но менее рекомендуемый способ найти минимум/максимум массива — отсортировать массив в порядке возрастания. Тогда первый и последний элементы отсортированного массива будут минимальным и максимальным элементом соответственно.
using System; public class Example { public static void Main() { int[] arr = { 8, 3, 5, –1, 2 }; Array.Sort(arr); if (arr.Length > 0) { Console.WriteLine(“Minimum number is “ + arr[0]); Console.WriteLine(“Maximum number is “ + arr[arr.Length – 1]); } } } |
Скачать Выполнить код
результат:
Minimum number is -1
Maximum number is 8
3. Использование пользовательской процедуры
Наконец, мы можем написать собственную процедуру для нахождения минимального и максимального числа массива. Идея состоит в том, чтобы пройтись по массиву и отслеживать минимальное или максимальное значение, найденное на данный момент. Вот как будет выглядеть код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
using System; public class Example { public static int findMin(int[] arr) { if (arr.Length == 0) { throw new Exception(“Array is empty”); } int min = int.MaxValue; foreach (var i in arr) { if (i < min) { min= i; } } return min; } public static int findMax(int[] arr) { if (arr.Length == 0) { throw new Exception(“Array is empty”); } int max = int.MinValue; foreach (var i in arr) { if (i > max) { max = i; } } return max; } public static void Main() { int[] arr = { 8, 3, 5, –1, 2 }; Console.WriteLine(“Minimum number is “ + findMin(arr)); Console.WriteLine(“Maximum number is “ + findMax(arr)); } } |
Скачать Выполнить код
результат:
Minimum number is -1
Maximum number is 8
Вот и все, что касается нахождения минимального и максимального числа из массива в C#.
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
I wrote bellow to compare what i said by @Marc Gravell, the way I told is a little faster in my PC, and the linq one is slowest way, Also if you change the position of functions (in code) you will always gain a better performance with a version with if
static void Main(string[] args)
{
Dictionary<string, List<long>> dic = new Dictionary<string, List<long>>();
dic["First"] = new List<long>();
dic["Second"] = new List<long>();
dic["Third"] = new List<long>();
for (int i = 0; i < 500; i++)
{
int[] array = GetRandomArray();
Stopwatch stopWacth = new Stopwatch();
stopWacth.Restart();
int n1 = FindMin(array);
stopWacth.Stop();
long firstTicks = stopWacth.ElapsedTicks;
dic["First"].Add(firstTicks);
stopWacth.Restart();
int n2 = AnotherFindMin(array);
stopWacth.Stop();
long secondTick = stopWacth.ElapsedTicks;
dic["Second"].Add(secondTick);
stopWacth.Restart();
int n3 = array.Min();
stopWacth.Stop();
long thirdTick = stopWacth.ElapsedTicks;
dic["Third"].Add(thirdTick);
Console.WriteLine("first tick : {0}, second tick {1}, third tick {2} ", firstTicks, secondTick, thirdTick);
}
Console.WriteLine("first tick : {0}, second tick {1}, third tick {2} ", dic["First"].Average(), dic["Second"].Average(), dic["Third"].Average());
Console.ReadLine();
}
public static int[] GetRandomArray()
{
int[] retVal = new int[1000000];
Random r = new Random();
for (int i = 0; i < 1000000; i++)
{
retVal[i] = r.Next(1000000000);
}
return retVal;
}
public static int FindMin(int[] arr)
{
switch (arr.Length)
{
case 0: throw new InvalidOperationException();
case 1: return arr[0];
case 2: return Math.Min(arr[0], arr[1]);
default:
int min = arr[0];
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] < min) min = arr[i];
}
return min;
}
}
public static int AnotherFindMin(int[] arr)
{
if (arr.Length > 0)
{
int min = arr[0];
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] < min) min = arr[i];
}
return min;
}
else
{
throw new InvalidOperationException();
}
}
}
// revised test by Marc (see comments discussion)
static class Test {
static void Main(string[] args)
{
Dictionary<string, List<long>> dic = new Dictionary<string, List<long>>();
dic["First"] = new List<long>();
dic["Second"] = new List<long>();
dic["Third"] = new List<long>();
const int OUTER_LOOP = 500, INNER_LOOP = 500000;
for (int arrSize = 1; arrSize <= 3; arrSize++)
{
for (int i = 0; i < OUTER_LOOP; i++)
{
int[] array = GetRandomArray(arrSize);
Stopwatch stopWacth = Stopwatch.StartNew();
for (int j = 0; j < INNER_LOOP; j++)
{
int n1 = FindMin(array);
}
stopWacth.Stop();
long firstTicks = stopWacth.ElapsedTicks;
dic["First"].Add(firstTicks);
stopWacth = Stopwatch.StartNew();
for (int j = 0; j < INNER_LOOP; j++)
{
int n2 = AnotherFindMin(array);
}
stopWacth.Stop();
long secondTick = stopWacth.ElapsedTicks;
dic["Second"].Add(secondTick);
stopWacth = Stopwatch.StartNew();
for (int j = 0; j < INNER_LOOP; j++)
{
int n3 = array.Min();
}
stopWacth.Stop();
long thirdTick = stopWacth.ElapsedTicks;
dic["Third"].Add(thirdTick);
//Console.WriteLine("{3}: switch : {0}, 0-check {1}, Enumerable.Min {2} ", firstTicks, secondTick, thirdTick, arrSize);
}
Console.WriteLine("{3}: switch : {0}, 0-check {1}, Enumerable.Min {2} ", dic["First"].Average(), dic["Second"].Average(), dic["Third"].Average(), arrSize);
}
Console.WriteLine("Done");
Console.ReadLine();
}
public static int[] GetRandomArray(int size)
{
int[] retVal = new int[size];
Random r = new Random();
for (int i = 0; i < retVal.Length; i++)
{
retVal[i] = r.Next(1000000000);
}
return retVal;
}
public static int FindMin(int[] arr)
{
switch (arr.Length)
{
case 0: throw new InvalidOperationException();
case 1: return arr[0];
case 2: return arr[0] < arr[1] ? arr[0] : arr[1];
default:
int min = arr[0];
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] < min) min = arr[i];
}
return min;
}
}
public static int AnotherFindMin(int[] arr)
{
if (arr.Length > 0)
{
int min = arr[0];
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] < min) min = arr[i];
}
return min;
}
else
{
throw new InvalidOperationException();
}
}
}
2 / 2 / 0 Регистрация: 07.04.2016 Сообщений: 34 |
|
1 |
|
Найти минимальный и максимальный элемент массива30.04.2016, 15:28. Показов 59344. Ответов 5
Как найти максимальный и минимальный элемент ,создав массив чисел. А главное как расписать в си шарпе?
0 |
Dark Byte 30 / 47 / 19 Регистрация: 23.10.2014 Сообщений: 1,001 |
||||
30.04.2016, 15:33 |
2 |
|||
0 |
sergeevdokimov 2 / 2 / 0 Регистрация: 07.04.2016 Сообщений: 34 |
||||
30.04.2016, 16:30 [ТС] |
3 |
|||
Программа написана, но почему-то не работает правильно. В чём проблема?
1 |
10 / 10 / 15 Регистрация: 29.11.2015 Сообщений: 43 |
|
30.04.2016, 17:23 |
4 |
зачем в цикле нахождения max в условии стоит “a[i] < 5” ?
0 |
2 / 2 / 0 Регистрация: 07.04.2016 Сообщений: 34 |
|
30.04.2016, 18:05 [ТС] |
5 |
даже если поставлю “n” заместь “5”, всё равно не правильно работаёт!
0 |
Dragon6 5 / 5 / 4 Регистрация: 10.02.2011 Сообщений: 48 |
||||||||
01.05.2016, 00:20 |
6 |
|||||||
Там не должно быть такого условия (“a[i] < что-либо”), ведь что делает цикл нахождения max (да и min, в принципе, тоже):
ну или:
На личное усмотрение
1 |
I get three values from three variables. How can i check who is the highest number and who is the lowest number?
The numbers are represented like this:
private int _score1;
private int _score2;
private int _score2;
Code:
Public int Highest
{
return the highest number here;
}
public int Lowest
{
return the lowest number here;
}
Can i calculate the highest and the lowest number in my constructor?
Paul Sasik
78.9k20 gold badges149 silver badges188 bronze badges
asked Dec 8, 2010 at 18:08
8
The obligatory Linq answer:
Public int Highest(params int[] inputs)
{
return inputs.Max();
}
public int Lowest(params int[] inputs)
{
return inputs.Min();
}
The beauty of this one is that it can take any number of integer inputs. To make it fail-safe you should check for a null/empty inputs array (meaning nothing was passed into the method).
To do this without Linq, you basically just have to mimic the logic performed by the extension method:
Public int Lowest(params int[] inputs)
{
int lowest = inputs[0];
foreach(var input in inputs)
if(input < lowest) lowest = input;
return lowest;
}
Again, to make it foolproof you should check for an empty or null inputs array, because calling Lowest() will throw an ArrayIndexOutOfBoundsException.
answered Dec 8, 2010 at 18:13
KeithSKeithS
69.8k21 gold badges111 silver badges164 bronze badges
4
This is one way to do it:
public int Highest
{
get { return Math.Max(_score1, Math.Max(_score2, _score3)); }
}
public int Lowest
{
get { return Math.Min(_score1, Math.Min(_score2, _score3)); }
}
answered Dec 8, 2010 at 18:12
cdhowiecdhowie
156k24 gold badges285 silver badges299 bronze badges
0
int[] numbers = new[] { _score1, _score2, _score3 };
int min = numbers.Min();
int max = numbers.Max();
answered Dec 8, 2010 at 18:15
HankHank
8,21912 gold badges47 silver badges57 bronze badges
4
Highest
return (x > y) ? (x > z ? x : z) : (y > z ? y : z)
Lowest
return (x < y) ? (x < z ? x : z) : (y < z ? y : z)
answered Dec 8, 2010 at 18:12
Russell SteenRussell Steen
6,4646 gold badges37 silver badges56 bronze badges
1
Here’s something you could do:
public class Numbers
{
private int _number1;
private int _number2;
private int _number3;
public readonly int Highest;
public readonly int Lowest;
public Numbers(int num1, int num2, int num3)
{
int high;
int low;
_number1 = num1;
_number2 = num2;
_number3 = num3;
high = num1 > num2 ? num1 : num2;
high = high > num3 ? high : num3;
low = num1 < num2 ? num1 : num2;
low = low < num3 ? low : num3;
Highest = high;
Lowest = low;
}
}
answered Dec 8, 2010 at 18:17
Jeff LaFayJeff LaFay
12.8k13 gold badges71 silver badges100 bronze badges
If you want to simply check which is the highest you can do this
private int _highest = _score1;
if (_score2 > _highest)
_highest = _score2
if (_score3 > _highest)
_highest = _score3
Similarly, you can find the lowest like so
private int _lowest = _score1;
if (_score2 < _lowest)
_lowest = _score2
if (_score3 < _lowest)
_lowest = _score3
answered Dec 8, 2010 at 18:13
alexcocoalexcoco
6,6576 gold badges26 silver badges39 bronze badges
Using LINQ-to-Objects, you could do something like this.
var numbers = new [] {_score1, _score2, _score3};
numbers.Sort();
var lowest = numbers.First();
var highest = numbers.Last();
answered Dec 8, 2010 at 18:11
James KovacsJames Kovacs
11.5k40 silver badges44 bronze badges
3
For a reference: in some cases you’ll be having more than three variables (possibly not knowing how many). If they are stored in an array, here’s the way to do it:
int Highest(int[] numbers)
{
int highest = Int32.MinValue();
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] > highest)
highest = numbers[i];
}
return highest;
}
int Lowest(int[] numbers)
{
int lowest = Int32.MaxValue();
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] < lowest)
lowest = numbers[i];
}
return lowest;
}
This will work for any length of int array.
answered Dec 8, 2010 at 18:20
Nikola MaleševićNikola Malešević
1,7296 gold badges21 silver badges43 bronze badges
Find the Largest and smallest number
using System;
namespace LargeSmall;
{
class Program
{
public static void Main()
{
float large, small;
int[] a = new int[50];
Console.WriteLine("Enter the size of Array");
int max = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter the array elements");
for (int i = 0; i < max; i++)
{
string s1 = Console.ReadLine();
a[i] = Int32.Parse(s1);
}
Console.Write("");
large = a[0];
small = a[0];
for (int i = 1; i < max; i++)
{
if (a[i] > large)
large = a[i];
else if (a[i] < small)
small = a[i];
}
Console.WriteLine("Largest element in the array is {0}", large);
Console.WriteLine("Smallest element in the array is {0}", small);
}
}
Kevin L
1,0663 gold badges12 silver badges21 bronze badges
answered Aug 21, 2014 at 1:55
Here is simple logic for finding Smallest Number
Input : 11, 0 , 3, 33 Output : “0”
namespace PurushLogics
{
class Purush_SmallestNumber
{
static void Main()
{
int count = 0;
Console.WriteLine("Enter Total Number of Integersn");
count = int.Parse(Console.ReadLine());
int[] numbers = new int[count];
Console.WriteLine("Enter the numbers"); // Input 44, 55, 111, 2 Output = "2"
for (int temp = 0; temp < count; temp++)
{
numbers[temp] = int.Parse(Console.ReadLine());
}
int smallest = numbers[0];
for (int small = 1; small < numbers.Length; small++)
{
if (smallest > numbers[small])
{
smallest = numbers[small];
}
}
Console.WriteLine("Smallest Number is : "{0}"",smallest);
Console.ReadKey();
}
}
}
answered Feb 15, 2018 at 8:02
Встречаю часто вопросы у студентов по поиску минимального значения в массиве, решил привести различные вариации поиска в разных массивах.
Поиск минимального значения в одномерном массиве с помощью Linq.
static void Main(string[] args) { int[] num = { 2, 5, 6, 3, 7, 9, 1 }; //Одномерный Console.WriteLine(num.Min()); Console.ReadKey(); } |
Поиск максимального значения в одномерном массиве с помощью Linq.
static void Main(string[] args) { int[] num = { 2, 5, 6, 3, 7, 9, 1 }; //Одномерный Console.WriteLine(num.Max()); Console.ReadKey(); } |
Поиск минимального значения в одномерном массиве с помощью цикла методом перебора.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
static void Main(string[] args) { int[] num = { 2, 5, 6, 3, 7, 9, 1 }; //Одномерный int tmpMin = int.MaxValue; for (int i = 0; i < num.Length; i++) { if (tmpMin > num[i]) { tmpMin = num[i]; } } Console.WriteLine(tmpMin); Console.ReadKey(); } |
Поиск максимального значения в одномерном массиве с помощью цикла методом перебора.
static void Main(string[] args) { int[] num = { 2, 5, 6, 3, 7, 9, 1 }; //Одномерный int tmpMax = int.MinValue; for (int i = 0; i < num.Length; i++) { if (tmpMax < num[i]) { tmpMax = num[i]; } } Console.WriteLine(tmpMax); Console.ReadKey(); } |
Поиск минимального значения в многомерном массиве, с помощью Linq
Многомерный массив, в отличие от одномерного массива, не позволяет нам напрямую обратиться к методу Min. Но, это можно легко исправить, если воспользоваться методом Cast<T>, с помощью которого можно преобразовать многомерный массив в обобщенную коллекцию типа IEnumerable<T>. После чего нам станет доступен метод Min, и мы сможем найти минимальное значение массива, например:
static void Main(string[] args) { int[,] numbers = { { 100, 20, 63, 39, 428, 118 }, { 22, 34, 63, 59, 68, 26 } }; IEnumerable<int> colNumbs = numbers.Cast<int>(); int minValue = colNumbs.Min(); Console.WriteLine(minValue); Console.ReadKey(); } |
Поиск максимального значения в многомерном массиве, с помощью Linq
Поиск минимального значения в массив массивов, или зубчатом массиве.
static void Main(string[] args) { int[,] numbers = { { 100, 20, 63, 39, 428, 118 }, { 22, 34, 63, 59, 68, 26 } }; IEnumerable<int> colNumbs = numbers.Cast<int>(); int maxValue = colNumbs.Max(); Console.WriteLine(maxValue); Console.ReadKey(); } |
Чтобы найти минимальное значение в Jagged массиве, необходимо преобразовать содержимое массива в объект типа IEnumerable<T>. , но только выполнить эту операцию нужно не с помощью метода Cast, а например, с помощью метода SelectMany:
static void Main(string[] args) { int[][] numbers = { new int [] {12,123,35,75,33}, new int [] {44,42,64,96}, new int [] {121,42,733,45}}; int minValue = numbers.SelectMany(x => x).Min(); Console.WriteLine(minValue); Console.ReadKey(); } |
Поиск максимального значения в массив массивов, или зубчатом массиве.
static void Main(string[] args) { int[][] numbers = { new int[] { 12, 123, 35, 75, 33 }, new int[] { 44, 42, 64, 96 }, new int[] { 121, 42, 733, 45 } }; int maxValue = numbers.SelectMany(x => x).Max(); Console.WriteLine(maxValue); Console.ReadKey(); } |