Мне нужно вычислить медиану для группы значений в одной из моих функций C #.Я использовал формулу с сайта, mathisfun .Ниже приведены моя модель данных и код.
public class DataModel
{
public string Group { get; set; }
public long? Population { get; set; }
}
Пример списка данных выглядит следующим образом:
> dataList Count = 7
> [0]: {DataModel}
> Group: "16 to 24" Population: 39657245
> [1]: {DataModel} Group: "25 to 34" Population: 58957845
> [2]: {DataModel} Group: "35 to 44" Population: 12557845
> [3]: {DataModel} Group: "45 to 54" Population: 25698746
> [4]: {DataModel} Group: "55 to 64" Population: 325487
Ниже приведена логика функции, которая принимает dataList в качестве входного значения и возвращает медианное значение.как вывод.
public int CalculateMedianAge(IList<DataModel> dataList)
{
int median = 0;
var sum = 0;
var sumRange = 0;
DataModel medianGroup = new DataModel();
foreach (var item in dataList)
{
sum = sum + (int)item.Population;
}
int range = (sum + 1) / 2;
foreach(var entry in dataList)
{
sumRange = sumRange + (int)entry.Population;
if (range > sumRange)
continue;
else
{
medianGroup = entry;
break;
}
}
var lowerBoundary = int.Parse(medianGroup.Group.Split(' ')[0]) - 0.5;
var cumulativeFrequency = 0;
for (int s = 0; s< dataList.IndexOf(medianGroup); s++)
{
cumulativeFrequency = cumulativeFrequency + (int)dataList[s].Population;
}
var width = int.Parse(medianGroup.Group.Split(' ')[2]) - int.Parse(medianGroup.Group.Split(' ')[0]);
//L is the lower class boundary of the group containing the median - lowerBoundary
//n is the total number of values - sum
//B is the cumulative frequency of the groups before the median group - cumulativeFrequency
//G is the frequency of the median group - (int)lowerBoundary.Population
//w is the group width - width
//MedianAge = L + (((n/2) - B) / G) * W
median = (int)(lowerBoundary + (((sum/2) - cumulativeFrequency) / (int)medianGroup.Population) * width);
return median;
}
Он работает нормально, и я могу также получить среднее значение.Но я пытаюсь пересмотреть это с LINQ.Я не хочу держать это с заявлениями Continue и Break.
Может кто-нибудь предложить / пересмотреть вышесказанное?