Передача пустого аргумента IEnumerable в метод - PullRequest
9 голосов
/ 05 мая 2010

У меня есть этот метод (упрощенный):

void DoSomething(IEnumerable<int> numbers);

И я вызываю это так:

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

Переменная results формируется с условием выбора LINQ (IEnumerable).

Мне было интересно, это List<int>() лучший (самый быстрый) способ пропустить пустую коллекцию или new int[0] лучше? Или что-то еще будет быстрее, Collection и т. Д.? В моем примере null не будет в порядке.

Ответы [ 2 ]

28 голосов
/ 05 мая 2010

Я бы использовал Enumerable.Empty<int>()

DoSometing(condition ? results : Enumerable.Empty<int>());
1 голос
/ 06 мая 2010

@ 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
}

илиthis:

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

или 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и возьмите), а затем добавьте и добавьте начальные и конечные значения.Начальное и конечное значения были интерполированы между последним не извлеченным значением и первым извлеченным значением (для начала) и между последним извлеченным значением и первым не извлеченным значением (для конца).Затем полученную последовательность снова оперировали, возможно, в обратном порядке.

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

1 2 3 4 5

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

...