質問
次のようなメソッドがあります:
AverageAndDoSomeMath (Point2)
そしてどのように処理するのだろうか:
AverageAndDoSomeMath (Point2) // single
AverageAndDoSomeMath (Point2 collection) // multiple
できれば単一の実装を使用してください。
コレクションについては、IEnumerable型を使用してあらゆる種類のコレクションを渡すことを計画していますが、単一の値については、コレクション自体は目的を果たさないため、ラップしてコレクションとして渡したくありません。タイプを満たすため以外。
最も明確で、最速で、最も効率的な方法で最適に処理するにはどうすればよいですか?
編集:より良いメソッド名を選択する必要があったかもしれませんが、このメソッドはすべてのポイントの平均を計算します。1つの値については意味がありませんが、値は計算と言うために使用される別の値ですが、重要なのは平均値を見つけることなので、1番目のメソッドを呼び出すことはできません。
解決
あなたはそれをラップしてコレクションとして渡したくないと言ったのは知っていますが、最小限の手間でこれを行うには2つの方法があります。 。
メソッドでparamsを使用できます:
public void Average(params Point2[] points)
その後、任意の数の引数または配列で呼び出すことができます:
Average(P1);
Average(P2, P3, P4);
Average(); // this one becomes an empty array in the method
Point[] array = new Point[] { P1, P2, P3, P4 };
Average(array);
または、短い配列構文を使用してオブジェクトをラップすることもできます:
Average({ P1 }); // this is legal C# for making an array with 1 element
編集:メモを読んだ後は、params配列を使用することが最も明確な方法であることをお勧めします。唯一の本当の欠点は、最初にIEnumerable<Point2>
を呼び出さずにList<Point2>
(またはToArray()
などの他のコレクション)を渡すことができないことです。実際の配列しか受け取らないためです。
他のヒント
2つのメソッドを記述する
- AverageAndDoSomeMath(Point2ポイント)
- AverageAndDoSomeMath(IEnumerable <!> lt; Point2 <!> gt;ポイント)
1番目のものをコレクションにラップして2番目のものを呼び出します。
public decimal AverageAndDoSomeMath (Point2 point)
{
return AverageAndSomeMath(new []{point});
}
それはあなたがすでに念頭に置いていたものだと推測していますが、正しい解決策ではないと考えましたよね?
編集:メソッドを簡素化(Freddy Riosに感謝)
メソッドごとに1つの責任がある場合、メソッドは1つのこと(算術平均の計算)だけを行う必要があると言うでしょう。それだけです。 <!> quot; AndDoSomeOtherMath <!> quot;はありません。
平均について式を見ると、確かに意味のあるものを計算できます。一点だけです2つ以上必要な標準偏差です。
FYI、すべての値を保存しなくても、その場で平均と標準偏差を計算できます。メモリ上ではるかに簡単です。ジョンD.クックには標準偏差のためにそれを行う方法に関する素晴らしいブログ記事。