-3

いくつかのコンテキスト: コレクションに物を追加するための主なメソッドが Add (またはそのようなもの) という名前のメソッド (または複数のメソッド) を介して行われるクラスを作成したいと思います。そのため、最良のシグネチャは params object[] です。内部的には、まさにこの関数は、受け入れることができるすべてのタイプを切り替え/ if-else する必要があります。したがって、最初はこの object[] 配列を受け入れることができましたが、object[][] や object[][][] なども受け入れて、メソッド/関数を内部的にフラット化できるようにしたいと思うかもしれません。ユーザーは、この関数を呼び出す前にそれを行う必要はありません。

そう...

単一の種類のオブジェクトに対してさまざまなレベルのリスト型を受け入れることができる関数を作成することは可能ですか? 副次的な質問として、クラスへのインターフェースを設計するとき、object[]またはどちらを受け入れるのが良いですIEnumerable<object>params object[]? (編集:すでに十分なことが起こっているため、質問から削除されました。)

たとえば、 , の両方/すべて、および場合によっては , (および on、on および on など) のようなさらにネストを受け入れる関数を考えobject[]ていますIEumerable<object>IEnumerable<IEnumerable<object>>object[][]

これは可能ですか?

4

4 に答える 4

16

クラス自体に、T を受け取るメソッド Add と、T のシーケンスを受け取る AddRange メソッドがあることに気付くでしょうList<T>。2 つの理由から、Add をオーバーロードして両方を実行しようとはしません。1 つ目は、追加することと一連のものを追加することは論理的に異なるためです。2 つ目は、オーバーロードの解決が非常に複雑になるためです。

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

どちらが良いですか:受け入れるobject[]か、IEnumerable<object>またはparams object[]

いったいどうやって知ればいいの?メソッドを呼び出すのは私たちではありません。あなたが尋ねるべき人は、あなたのメソッドを呼び出すコードを書いている人です.

于 2012-01-09T19:12:38.040 に答える
1

1つの関数の2つのオーバーロードを作成します。1つはを受け入れIEnumerable<T>、もう1つはを受け入れますparams T[]。前者を呼び出して後者を実装します。ネストを忘れて、LINQはを使用してコレクションを簡単にフラット化できSelectManyます。

于 2012-01-09T19:05:02.210 に答える