OOC: Из любопытстваOOC: В чем разница между ToList() и литьем в List <T> в .NET?
Так, как мало упражнений и для обучения, я решил проверить, был ли я в состоянии реализовать очень простую рекурсивную функцию, которая будет возвращать List<int>
, но со следующими ограничениями :
1- Результат должен быть возвращен самой функцией (в отличие от переданного в качестве аргумента функции void
).
2 - Отсутствуют локальные «названные» переменные, объявленные в теле функции.
я придумал ниже решения (BTW: это может быть улучшено в любом случае?)
При этом, я узнал, что ToList()
это не то же самое, как приведение к List<T>
(смотри пример ниже) - Кто-нибудь, кто может объяснить, что происходит под капотом, и какая разница между ними?
Спасибо!
PS - Я использую версию 4.0 (в случае, если это имеет значение).
EDIT: ошибка во время выполнения является Unable to cast object of type '<ConcatIterator>d__71'1[System.Int32]' to type 'System.Collections.Generic.List'1[System.Int32]'
public static List<int> SomeIntegers(int min, int max)
{
//assume max >= min for simplicity
if (min == max)
return new List<int>() { min };
// runtime error
//return (List<int>)(SomeIntegers(min, max - 1).Concat(new List<int>() { max }));
//works
return (SomeIntegers(min, max - 1).Concat(new List<int>() { max })).ToList();
}
Спасибо, я только что проверил это; поэтому кажется, что мы не получаем «Enumerable.Range (min, max, step)» или «Enumerable.Range (min, max, x => x * x)», правильно? –
Не прямо, но вы можете сделать что-то вроде 'Enumerable.Range (min, length) .Where (x => (x-min)% step == 0)' и 'Enumerable.Range (min, length). Выберите (x => x * x); 'получить эквивалент этих –
Также обратите внимание, что второй параметр в Enumerable.Range равен LENGTH, а не MAX –