我有这种方法(简化):
void DoSomething(IEnumerable<int> numbers);
我这样调用它:
DoSomething(condition==true?results:new List<int>());
变量results
由LINQ选择条件(IEnumerable)组成。
我想知道这是List<int>()
传递空集合的最佳方式(最快?),还是new int[0]
更好?或者,其他东西会更快,Collection
等等?在我的例子中null
不行。
答案 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操作一起使用。不确定这些是否真的是“好”的想法,但他们应该完成工作。