9

私はこの方法を持っています(簡略化):

void DoSomething(IEnumerable<int> numbers);

そして、私はそれを次のように呼び出します:

DoSomething(condition==true?results:new List<int>());

変数resultsは、LINQ選択条件(IEnumerable)で形成されます。

List<int>()これが空のコレクションを渡すための最良の方法(最速?)なのか、それともnew int[0]優れているのか疑問に思いました。または、他の何かがより高速になるCollection、など?私の例nullでは大丈夫ではないでしょう。

4

2 に答える 2

29

私は使うだろうEnumerable.Empty<int>()

DoSometing(condition ? results : Enumerable.Empty<int>());
于 2010-05-05T13:14:01.730 に答える
1

@avance70。元の質問への回答ではありませんが、1 つの整数値を持つ IEnumerable に関する avance70 の質問への回答です。コメントとして追加したかったのですが、コメントを追加するのに十分な担当者がいません。厳密に不変のシーケンスに関心がある場合は、いくつかのオプションがあります。

一般的な拡張方法:

public static IEnumerable<T> ToEnumerable<T>(this T item)
{
  yield return item;
}

次のように使用します。

foreach (int i in 10.ToEnumerable())
{
  Debug.WriteLine(i); //Will print "10" to output window
}

またはこれ:

int x = 10;
foreach (int i in x.ToEnumerable())
{
  Debug.WriteLine(i); //Will print value of i to output window
}

またはこれ:

int start = 0;
int end = 100;
IEnumerable<int> seq = GetRandomNumbersBetweenOneAndNinetyNineInclusive();

foreach (int i in start.ToEnumerable().Concat(seq).Concat(end.ToEnumerable()))
{
  //Do something with the random numbers, bookended by 0 and 100
}

最近、上記の開始/終了の例のようなケースがありました。ここでは、シーケンスから連続する値を「抽出」し (Skip と Take を使用)、開始値と終了値を前に追加して追加する必要がありました。開始値と終了値は、最後の抽出されていない値と最初に抽出された値の間 (開始の場合)、および最後に抽出された値と最初の抽出されていない値の間 (終了の場合) で補間されます。結果として得られたシーケンスは、おそらく逆に、再び操作されました。

したがって、元のシーケンスが次のように見える場合:

1 2 3 4 5

3 と 4 を抽出し、2 と 3、4 と 5 の間の補間値を追加する必要がある場合があります。

2.5 3 4 4.5

Enumerable.Repeat。次のように使用します。

foreach (int i in Enumerable.Repeat(10,1)) //Repeat "10" 1 time.
{
  DoSomethingWithIt(i);
}

もちろん、これらは IEnumerable であるため、他の IEnumerable 操作と組み合わせて使用​​することもできます。これらが本当に「良い」アイデアかどうかはわかりませんが、仕事を成し遂げるはずです。

于 2010-05-05T21:45:10.203 に答える