Мне (упростили) этот метод:
void DoSomething(IEnumerable<int> numbers);
И я вызываю его как это:
DoSomething(condition==true?results:new List<int>());
Переменная results
формируется с условием выбора LINQ (IEnumerable).
Я задавался вопросом, это List<int>()
лучший способ (самое быстрое?) передать пустой набор, или new int[0]
лучше? Или, что-то еще было бы быстрее, a Collection
, и т.д.? В моем примере null
не был бы в порядке.
Я бы использовал Enumerable.Empty
DoSometing(condition ? results : Enumerable.Empty<int>());
@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. Не уверен, что это действительно "хорошие" идеи или нет, но они должны сделать свою работу.