2010-05-05 1 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

+0

+1. Не знал о Enumerable.Empty – AlwaysAProgrammer

+0

Это именно то, что я искал! – avance70

1

@ avance70. На самом деле это не ответ на оригинальный вопрос, а ответ на вопрос avance70 об 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 
} 

У меня недавно был случай, как пример начала/конца выше, где мне пришлось «извлекать» последовательные значения из последовательности (используя «Пропустить и принять»), а затем добавлять и добавлять начальные и конечные значения. Начальные и конечные значения были интерполированы между последним не извлеченным значением и первым извлеченным значением (для начала) и между последним извлеченным значением и первым неисчерпаемым значением (для конца). Затем полученную последовательность затем снова включали, возможно, реверсивный.

Таким образом, если исходная последовательность выглядела как:

я мог бы извлечь 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 операций. Не уверен, что это действительно «хорошие» идеи или нет, но они должны выполнить свою работу.