2016-10-19 2 views
1

У меня такой случай, мне нужно получить ненулевые значения массива, отсортировать их и найти медианную ценность. Я сделал следующее,LinQ: C# сортировать массив при копировании с помощью некоторых фильтров

var array2 = (from t in array1 where t.array2 != 0 select t.array2).ToArray(); 
Array.Sort(array2); 
var Median = array2.Length % 2 == 0 ? new List<double>() { ((array2[array2.Length/2 - 1]) + (array2[array2.Length/2]))/2 } : new List<double>() { array2[array2.Length/2] }; 

На данный момент все идет хорошо. Но я думаю о слиянии первых двух строк в одном, например, копировании ненулевых значений с использованием метода orderby. Для этого я попытался, как,

var array2 = (from t in ipedsTableValue where t.array2 != 0 select t.array2).ToArray(t); // Not worked 

предложить Также меня, если есть какие-либо супер способ вычислить медиану массива в C#, потому что линия также выглядит настолько большой, и я боюсь, что это не так легко читаемым.

Я упоминал SO ресурс: Add a Median Method to a List Хотя он работает нормально, я думаю о некотором простом и эффективном коде с некоторым количеством кодов. Любое предложение было бы полезно!

+0

Возможный дубликат [Добавить медианный метод в список] (http://stackoverflow.com/questions/5275115/add-a-median-method-to-a-list) –

+0

Изменена начальная строка, предположить, что вы хотите получать ненулевые значения в массиве, сортировать их (что требуется для медианы) и вычислять медианную. Неверно было предположить, что вам нужно скопировать другой массив, что вызвало первоначальное несоответствие в моем первом решении. –

ответ

0

Попробуйте как этот

var array2= (from t in array1 where t.array2!= 0 select t.array2).OrderBy(t => t).ToArray(); 
+0

Это потрясающе. Спасибо TomFarCry –

+0

Где медианный расчет? –

1

Вы можете использовать linq и условный оператор.

var filterd = array1 
    .Where(x => x.array2 != 0) 
    .Select(x => x.array2) 
    .OrderBy(x => x) 
    .ToArray(); 

var length = filterd.Length; 

var median = length % 2 == 0 
    ? (filterd[length/2 - 1] + filterd[length/2])/2.0 
    : filterd[length/2]; 
+0

Спасибо за ответ, я получаю ошибку, как, Operator '! =' Не может применяться к операндам типа I. –

+0

@MJSuriya фиксированный. – dotctor

1

Это должно выглядеть примерно так, что

var median = array2.Take((array2.Length%2 == 0) ? ((array2.Length/2) + 1) : ((array2.Length + 1)/2)) 
        .Reverse() 
        .Take((array2.Length%2 == 0) ? 2 : 1) 
        .Sum(x => x); 
1

Массив копирования и упорядочения работы:

var filteredArray = array1.Where(x => x != 0.0).OrderBy(x => x).ToArray(); 

Вычислить медианы

double midpoint = (filteredArray.Count() - 1)/2.0; 
double median = (filteredArray[(int)(midpoint)] + filteredArray[(int)(midpoint + 0.5)])/2.0; 
+0

Я неправильно понял ваше первоначальное требование как копирование всех элементов в другой массив, кроме 0-го элемента, теперь я модифицирован, чтобы удалить значения 0.0 и вычисленную медианную. –

Смежные вопросы