Передача пустого аргумента IEnumerable методу

Мне (упростили) этот метод:

void DoSomething(IEnumerable<int> numbers);

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

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

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

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

9
задан avance70 5 May 2010 в 13:12
поделиться

2 ответа

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

DoSometing(condition ? results : Enumerable.Empty<int>());
28
ответ дан 4 December 2019 в 07:34
поделиться

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

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

1
ответ дан 4 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: