0

多くの数値を保持するdouble[]配列があります。

この配列内から特定の条件(xより大きい値、少なくともyの値など)に該当するセクションを選択するアルゴリズムがあります。

次に、セクション内のこれらすべての値の平均値を計算します。

つまり、私のセクションがインデックス20から40であるとしましょう。これで、20個の値ができました。C#でこれを行う簡単な方法はありますか、それとも配列をループして手動で平均を計算する必要がありますか?

4

6 に答える 6

8
var values = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var average = values.Skip(2).Take(5).Average();
于 2010-01-15T14:04:38.723 に答える
1

インデックスが20から40の番号がある場合、20の番号はなく、21の番号があることに注意してください。

Rangeメソッドを使用してインデックスのIEnumerableを作成してから、Averageメソッドを使用して数値の平均を取得できます。

double average = Enumerable.Range(20, 21).Select(i => numbers[i]).Average();
于 2010-01-15T14:08:50.623 に答える
1

Linqを使用する:

var myList = new double[] {1,2,3}
var avg = myList.Where(i => i > 1 && i < 2).Avg();
于 2010-01-15T14:01:55.283 に答える
0

Enumerable.Averageを使用します:

double[] values = new[] { 1.0, 2.0, 3.14, 2.71, 9.1 };
double average = values.Where(x => x > 2.0 && x < 4.0).Average();

したがって、これを選択メソッドで使用するには、それらのメソッドがを返すようにすることを検討する必要がありますIEnumerable<double>。したがって、例として:

public IEnumerable<double> GreaterThan(double[] values, double value) {
    for(int i = 0; i < values.Length; i++) {
        if(values[i] > value) {
            yield return values[i];
    }
}

それで:

// values is double[]
double average = GreaterThan(values, 2.0).Average();

上記の拡張メソッドを作成して、読みやすくすることもできます。

double average = values.GreaterThan(2.0).Average();

を返すフィルタリングメソッドを作成することをお勧めしますIEnumerable<double>

于 2010-01-15T14:02:14.080 に答える
0

linqのskipおよびtakeメソッドを使用して、特定のインデックスを選択できます。

var myData = new double[] { ..... };
var average = myList.Skip(20).Take(21).Average();
于 2010-01-15T14:05:31.623 に答える
0
double avg = array
    .Skip(startIndex)
    .Take(endIndex - startIndex + 1)
    .Average();
于 2010-01-15T14:05:36.180 に答える