2010-05-05 126 views
8

我有這樣的方法(簡化):傳遞空IEnumerable的參數的方法

void DoSomething(IEnumerable<int> numbers); 

我調用它是這樣的:

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

可變results與LINQ選擇條件形成(IEnumerable的)。

我想知道這是List<int>()最好的方法(最快?)通過一個空集合,或者是new int[0]更好?或者,別的會更快,Collection等?在我的示例null不會好。

回答

27

我會用Enumerable.Empty<int>()

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

不錯。我今天學到了一些東西! – spender 2010-05-05 13:14:37

+0

+1。不知道Enumerable.Empty – AlwaysAProgrammer 2010-05-05 13:15:48

+0

這正是我正在尋找! – avance70 2010-05-05 13:19:01

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 
} 

or this:

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),然後預先加入並附加開始和結束值。開始和結束值在最後未提取值和第一提取值(用於開始)之間以及最後提取值和第一非提取值(用於結束)之間插值。然後再次操作所得的序列,可能逆轉。

因此,如果原始序列看起來像:

我有可能提取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操作結合使用。不知道這些是否真的是「好」的想法,但他們應該完成工作。