Скажем, я хочу последовательность из 10 цифр, и у меня есть функция, которая производит номера по запросу:Как преобразовать цикл for (не foreach) в Linq?
var s = new List<int>();
for (var i=0; i<10; i++) {
s.Add(Magically_generate_a_very_special_number());
}
обычный способ решения этой проблемы. Однако, допустим, я хочу использовать LINQ. Я уже могу (не будем игнорировать различия между типами):
var s = Enumerable.Range(0, 10).Select(i => MathNet.Numerics.Statistics.DescriptiveStatistics())
Это почти достаточно для меня. Тем не менее, меня беспокоит, что сначала нужно указать диапазон целых чисел - это лишний шаг, так как я все равно отказываюсь от значения. Можно ли сделать что-то вроде следующего?
var s = Enumerable.ObjectMaker(Magically_generate_a_very_special_number).Take(10);
Кажется, что Enumerable.Repeat
почти делает то, что я хочу, но он принимает результат функции я даю его, а затем дублирует, вместо того, чтобы повторно оценить функцию.
Кстати, источником вдохновения для этого вопроса был метод Math.Net IContinuousDistribution.Samples
. Его тело выглядит следующим образом:
while (true)
{
yield return Generate_a_random_number();
}
Так что вы можете получить последовательность выборок из распределения с myDistribution.Samples.Take
. В принципе, я мог бы просто написать свой собственный метод для создания итератора таким же образом, но мне интересно, существует ли он уже существующий.
Может быть, я действительно из линии здесь, но ИМХО, цель LINQ заключается в уменьшении количества строк кода и выбрать определенные элементы из перечислимого на основе определенных условий или нет. Он не предназначен для создания новых объектов. – danish
Нет, это вполне разумный комментарий. Однако, в некоторых случаях, LINQ легче читать (в моих личных проектах). – Superbest