10

そのため、多くの場合、IEnumerable または ICollection をパラメーターとして受け入れる関数があります。単一の項目があり、それらを保持するコレクションがない場合は、次のように関数に渡す前にコレクションを作成する必要があります。

T o1, o2, o3;
Foo(new T[] { o1, o2, o3 });

最後の例で行ったように、私は常に配列またはリストを作成してきました。しかし、必要な IEnumerable または ICollection を作成するよりエレガントな方法はありますか?

これを行うことができれば、それは非常にクールです:

Foo({ o1, o2, o3 });

また、コンパイラは、IEnumerable または ICollection (関数が受け入れるものに応じて) のニーズを満たす最も抽象的な可能なコレクションを作成します。

とにかく、o1、o2、および o3 を IEnumerable または ICollection パラメーターに渡すにはどうすればよいでしょうか?

4

5 に答える 5

12

C# の現在のバージョン (3) は、明示的な型のない表記法をサポートしています。

Foo(new [] { o1, o2, o3 })

配列を作成します。Enumerable.Range連続した範囲の数値を作成するためのLinq もあります。他のすべてを実装する必要があります。Javaの精神で:

public static IEnumerable<T> AsList<T>(params T[] values) {
    return values;
}

次のように呼び出されます。

Foo(Enumerable.AsList(o1, o2, o3));
于 2009-09-26T15:02:53.813 に答える
3

「params」引数を持つメソッドを使用したことがあります。

Foo(params T[] ts)

そして、私が IEnumerable に固執している場合は、そのメソッドを IEnumerable を必要とするメソッドに委譲するだけです。

Foo(params T[] ts) { Foo(ts.AsEnumerable()); }

AsEnumerable を呼び出すか、再帰する必要があります。

于 2009-09-26T15:03:28.663 に答える
2

Foo が IEnumerable<T> を想定していると仮定すると、型推論を利用して次のことができます。

T o1, o2, o3;
Foo(new []{o1, o2, o3});
于 2009-09-26T15:01:56.227 に答える
2

配列を作成して渡すことは、現在のバージョンの C# でこれを実現するためのおそらく最も簡単で洗練された方法です。暗黙の配列型付けを利用することができます (つまりnew[] { ... }、しかし、それだけです。

この F# 構文に相当する C# を本当に探しているのではないでしょうか。

let foo = seq [ o1; o2; o3 ]

IEnumerable<T>指定された要素を反復処理するを生成します。('Seq' は、実際には 'IEnumerable` の F# エイリアスですが、F# にはそれらのサポートが組み込まれています。)

残念ながら、これは大部分が機能的な概念であるため、C# に相当するものはありません。

于 2009-09-26T15:03:57.843 に答える
0

配列を最後のパラメーターとして受け取るメソッドがある場合、そのパラメーターをマークするのが理にかなっている場合がありますparams。これにより、次のようにメソッドを呼び出すことができます。

Foo(o1, o2, o3);

これは、 の単体テストを作成するときに特に役立ちます。単体テストでFoo()は、多くの場合、パラメーターが配列ではなく、このように分離されているためです。

Foo()その位置に配列を取らないオーバーロードがある場合は、すぐに混乱する可能性があるため、これを行うことはお勧めしません。

paramsC# 言語で次のことが可能になることを願っていますIList<T>

void Foo(params IList<T> ts) { ... }
于 2009-09-26T15:18:48.133 に答える