Вопрос по arrays, c# – Сравните значение с массивом и получите ближайшее к нему значение
Я новичок в C #, и я пытаюсь выучить этот язык.
Ребята, можете ли вы дать мне совет, как я могу сравнить массив со значением, выбирающим самое низкое из него?
лайк:
Double[] w = { 1000, 2000, 3000, 4000, 5000 };
double min = double.MaxValue;
double max = double.MinValue;
foreach (double value in w)
{
if (value < min)
min = value;
if (value > max)
max = value;
}
Console.WriteLine(" min:", min);
дает мне самое низкое значениеw
Как я могу сравнить сейчас?
Если у меня есть:
int p = 1001 + 2000; // 3001
как теперь сравнить со списком массива и выяснить, что значение (3000) является ближайшим значением к моему & quot; Searchvalue & quot ;?
p, which is 3001 in this case, and you want to compare it against your array
w, и вы хотите, чтобы результат был 3000, что является значением в массиве, ближайшим к 3001. Это правильно?
Double[] w = { 1000, 2000, 3000, 4000, 5000 };
var minimumValueFromArray = w.Min();
производит
1000
, как и ожидалось, потому что мы выполняемEnumerable.Min.
То же самое дляEnumerable.Max, чтобы вычислить максимальное значение:
Double[] w = { 1000, 2000, 3000, 4000, 5000 };
var maximumValueFromArray = w.Max();
Учитывая, что вы сравниваете сdouble.MinValue
а такжеdouble.MaxValue
Я бы предположил, что вы хотите просто выбрать самое маленькое и самое большое значение из массива.
Если это не то, что вы ищете, уточните.
Dump
Error: User Rate Limit Exceeded"rookie in C# "Error: User Rate Limit ExceededEnumerable.Min
Error: User Rate Limit Exceeded
основываясь на вашем коде, вы можете достичь этого очень простым способом
Double[] w = { 1000, 2000, 3000, 4000, 5000 }; // it has to be sorted
double search = 3001;
double lowerClosest = 0;
double upperClosest = 0;
for (int i = 1; i < w.Length; i++)
{
if (w[i] > search)
{
upperClosest = w[i];
break; // interrupts your foreach
}
}
for (int i = w.Length-1; i >=0; i--)
{
if (w[i] <= search)
{
lowerClosest = w[i];
break; // interrupts your foreach
}
}
Console.WriteLine(" lowerClosest:{0}", lowerClosest);
Console.WriteLine(" upperClosest:{0}", upperClosest);
if (upperClosest - search > search - lowerClosest)
Console.WriteLine(" Closest:{0}", lowerClosest);
else
Console.WriteLine(" Closest:{0}", upperClosest);
Console.ReadLine();
в зависимости от позиции вашего значения поиска это будетless than O(n)
Вы можете сделать это с помощью простой математики, и есть разные подходы.
LINQ
Double searchValue = ...;
Double nearest = w.Select(p => new { Value = p, Difference = Math.Abs(p - searchValue) })
.OrderBy(p => p.Difference)
.First().Value;
Manually
Double[] w = { 1000, 2000, 3000, 4000, 5000 };
Double searchValue = 3001;
Double currentNearest = w[0];
Double currentDifference = Math.Abs(currentNearest - searchValue);
for (int i = 1; i < w.Length; i++)
{
Double diff = Math.Abs(w[i] - searchValue);
if (diff < currentDifference)
{
currentDifference = diff;
currentNearest = w[i];
}
}
Math.Abs()
Error: User Rate Limit Exceeded