将空的IEnumerable参数传递给方法

时间:2010-05-05 13:12:43

标签: c# generics ienumerable argument-passing

我有这种方法(简化):

void DoSomething(IEnumerable<int> numbers);

我这样调用它:

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

变量results由LINQ选择条件(IEnumerable)组成。

我想知道这是List<int>()传递空集合的最佳方式(最快?),还是new int[0]更好?或者,其他东西会更快,Collection等等?在我的例子中null不行。

2 个答案:

答案 0 :(得分:28)

我会使用Enumerable.Empty<int>()

DoSometing(condition ? results : Enumerable.Empty<int>());

答案 1 :(得分:1)

@ avance70。不是原始问题的答案,而是对avance70关于仅有1个整数值的IEnumerable的问题的回答。本来会把它添加为评论,但我没有足够的代表来添加评论。如果您对严格不可变序列感兴趣,可以选择以下几种方法:

通用扩展方法:

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);
}

当然,由于这些是IEnumerables,它们也可以与其他IEnumerable操作一起使用。不确定这些是否真的是“好”的想法,但他们应该完成工作。