Вопрос по arrays, c# – Сравните значение с массивом и получите ближайшее к нему значение

3

Я новичок в 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 ;?

да это правильно user982998
@ user982998 Добавлено еще одно решение. Felix K.
Просто чтобы уточнить, ваше значение поискаp, which is 3001 in this case, and you want to compare it against your array w, и вы хотите, чтобы результат был 3000, что является значением в массиве, ближайшим к 3001. Это правильно? rikitikitik
выбирая самое низкое - & gt; выбрать значение, которое дает наименьшую разницу? Vlad

Ваш Ответ

3   ответа
1
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Я бы предположил, что вы хотите просто выбрать самое маленькое и самое большое значение из массива.

Если это не то, что вы ищете, уточните.

DumpError: User Rate Limit Exceeded"rookie in C# "Error: User Rate Limit ExceededEnumerable.MinError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user982998
0

основываясь на вашем коде, вы можете достичь этого очень простым способом

    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)

13

Вы можете сделать это с помощью простой математики, и есть разные подходы.

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];
    }
}
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededmuchError: User Rate Limit ExceededMath.Abs()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы