Написать linq аналог алгоритма

121
26 марта 2021, 06:20
double min = Math.Abs(mass.Average() - mass[0]);
int ind = 0;
for (int i = 1; i < mass.Length; i++)
    if (Math.Abs(mass.Average() - mass[i]) < min)
    {
        min = Math.Abs(mass.Average() - mass[i]);
        ind = i;
    }

Необходимо найти индекс элемента, максимально приближенного к среднему арифметическому и записать в linq форме

Answer 1

допустим, есть массив

var mass = new [] {1, 3, 8, 11};    

Тода однострочный медленный вариант

Console.WriteLine(mass.Select((m, i)=>(i,m))
                    .OrderBy(m=>Math.Abs(m.m - mass.Average())).First().i); 

Двухстрочный, но чуть более быстрый

var average = mass.Average();
Console.WriteLine(mass.Select(( m, i)=>( Math.Abs(m-average) ,i))
                      .OrderBy(m=>m.Item1).First().i);

Самый быстрый - без linq, простым циклом пробежаться.

int ind = 0;
var average = mass.Average();
for(int i=1; i<mass.Length; i++)
{
    if (Math.Abs(mass[i] - average) < Math.Abs(mass[ind] - average))
    ind = i;
}
Console.WriteLine(ind);
READ ALSO
ASP.NET core mvc, передать параметр в функцию

ASP.NET core mvc, передать параметр в функцию

как из input передать параметры в функцию?я хочу взять из input value и передать в функцию как параметр, как это сделать?

111
События и сборка мусора в c#

События и сборка мусора в c#

Начал изучать концепцию событий в c#У меня есть следующие классы:

80
Как удалить контрольные точки windows?

Как удалить контрольные точки windows?

За основу взят этот код, я его немного переделал

106