非常に単純な分布図を作成しようとしていますが、テストのスコアの割合を対応する10の範囲に表示したいとします。LINQグルーピング:forループなしでこれを行うクリーンな方法がありますか
私はMath.Round(d.Percentage/10-0.5)、0)* 10のグループ化を考えていましたが、これは10の値を与えるはずです....しかし、私はおそらく範囲が不足しており、カウントがゼロであってもすべての範囲が表示される必要があることを考えれば、これを行う方法です。私はまた範囲配列の外部結合を行うことについて考えましたが、私はLinqにとってかなり新しいので、時間のために以下のコードを選択しました。私はしかし、より良い方法が何であるかを知りたいです。
メモ:経験レベルの異なる大規模なチームで作業する傾向があるため、平均的な開発者には非常に読みやすいままでない限り、超コンパクトなコードについては夢中ではありません。
提案がありますか?
public IEnumerable<TestDistribution> GetDistribution()
{
var distribution = new List<TestDistribution>();
var ranges = new int[] { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110 };
var labels = new string[] { "0%'s", "10%'s", "20%'s", "30%'s", "40%'s", "50%'s", "60%'s", "70%'s", "80%'s", "90%'s", "100%'s", ">110% "};
for (var n = 0; n < ranges.Count(); n++)
{
var count = 0;
var min = ranges[n];
var max = (n == ranges.Count() - 1) ? decimal.MaxValue : ranges[n+1];
count = (from d in Results
where d.Percentage>= min
&& d.Percentage<max
select d)
.Count();
distribution.Add(new TestDistribution() { Label = labels[n], Frequency = count });
}
return distribution;
}
わずかなカーブボールを動作します。いくつかのテストの後、範囲を<25,25-50,50-60,60-70,70-85,85-100(レターグレードを表す)に調整し、 "U"、 "F"、および " 「D」、「C」、「B」、「A」。これらの範囲は動的に設定され、ハードコードされていないため、単純なインクリメンタを使用してグループを定義する方法はありません。 – user1240087
範囲のクラス/構造体はMin、Max、Labelの各プロパティで役立ちます。 –