2012-01-09 22 views
-3

いくつかのコンテキスト:コレクションに物を追加する主な方法は、Add(またはそのようなもの)という名前のメソッドを使用するクラスを作成したいと思います。そして、最もよく見える署名はparams object []です。内部的には、この関数は/ if-elseをすべて受け入れることができるすべての型を切り替える必要があります。ですから、当初はこのオブジェクト[]配列を受け入れることができましたが、オブジェクト[] []、オブジェクト[] [] []なども受け入れることができ、その後メソッド/関数を内部的に平坦化できるユーザーはこの関数を呼び出す前にその操作を行う必要はありません。複数の型を受け入れるC#関数を書くより良い方法はありますか?

そう...

は、オブジェクトの単一の種類のリストの種類のさまざまなレベルを受け入れることができます関数を記述することが可能ですか? 逆の質問として、クラスへのインターフェイスを設計するときに、 object[]または IEnumerable<object>または params object[]を受け入れる方が良いですか? (編集:。十分に起こっがすでにありますので質問から打た)

たとえば、私はIEumerable<object>object[]の両方/すべてを受け入れる機能のことを考え、そしておそらくさらにように入れ子にしています:IEnumerable<IEnumerable<object>>object[][] (オン、オン、オンなど)。

これは可能ですか?

+4

これ以上の情報は必要な場合があります。あなたの質問は、あなたが何らかのタイプのTのシーケンスを取ることができたいと思っていますか?または実際には何かのシーケンス(つまり、あらゆるタイプのもの)。つまり、T []対リスト対HashSet対またはT []対リスト対 vsハッシュセットともっと関係がありますか? –

+2

この質問に対する普遍的な答えはありません。あなたが達成しようとしていることは本当に重要です。 –

答えて

1

IEnumerable<T>を受け入れる関数とparams T[]を受け入れる関数の2つのオーバーロードを作成します。前者を呼び出すことによって後者を実装します。ネスティングを忘れて、LINQはSelectManyを使って簡単にコレクションを平坦化できます。

2

1つのオプションは、1つの機能を作成し、それを必要以上に何度もオーバーロードすることです。オーバーロードされた関数を "基本"関数と呼ぶことができます。

+0

1番目を避けて2番目と3番目を実装すると、オブジェクト[]をparamsオブジェクト[]に渡すことができます。 –

+0

@JamesMichaelHareのおかげで感謝します。更新されました。 –

1

これは本当にリストの種類によって何を意味するかによって異なります。明示的に意味する場合は、IList<T>を受け入れる方法があります。あなたがミックスに配列を投げたいのであれば、本当にIEnumerable<T>を受け入れるべきです。それを変更する必要がない限り、配列は実際には機能しませんので、ICollection<T>を受け入れることができます。

+0

1次元配列の型は 'IList '(およびそれのベースインターフェイス)です。 – millimoose

+0

@Inerdial trueですが、 'Add'のようなものはサポートされていません。 –

+0

私はそれが主に完全性のために追加されました - あなたが配列を受け入れるときに両方を使用できること。 ( 'IEnumerable 'はあなたがコレクションをより良く変更したくないということを伝えます)。 – millimoose

16

List<T>クラス自体にTのシーケンスを取るAddRangeメソッドとAddメソッドが追加されていることに気づくでしょう.2つの理由でAddメソッドをオーバーロードして、両方を実行しようとしません。第一に、物を追加したり、たくさんのものを追加することは論理的に異なり、第二に、それは過負荷解決を非常に複雑にするからです。

Tのシーケンスをとるメソッドが必要な場合は、Tのシーケンスをとるメソッドを記述します。呼び出し元にシーケンスのシーケンスがある場合は、それらをフラット化します。彼らのために効果的に行う方法を推測しようとしないでください。優れている

object[]またはIEnumerable<object>またはparams object[]を受け入れるするには?

私たちはどのように知っていますか?私たちはそのメソッドを呼び出すものではありません。あなたが求めるべき人はあなたのメソッドを呼び出すためのコードを書く人です。

関連する問題