Любой доступный метод, который выполнит Func N раз и получит IEnumerable?

#c#

#c#

Вопрос:

Возможно, я спрашиваю об этом только потому, что ослепил себя чем-то блестяще очевидным, но,

Я ищу что-то вроде этого…

 IEnumerable<Foo> fooSeq = Enumerable.Generate(()=> new Foo(), 5);
  

что сделало бы fooSeq последовательностью из 5 новых экземпляров Foo.

Кажется, не могу его найти.

Ответ №1:

Не уверен, что именно вы пытаетесь сделать, но если вы пытаетесь сгенерировать 5 экземпляров Foo, это сработает

 IEnumerable<Foo> fooSeq = Enumerable.Range(1, 5).Select(x => new Foo())
  

Комментарии:

1. круто ли писать больной код в 1 строку? обычный цикл for для заполнения списка элементов понятен и будет доступен для чтения вечно, а не в первые 2 дня после его написания. Также никто не спросил бы, хммм — почему он заполнил 5 Foo таким больным способом?

2. @Valentin Я согласен с вами во всем, что вы сказали, но ИМХО, linq очень удобочитаем, с ним очень легко ознакомиться. Чтобы достичь того же результата без linq, вам понадобится отдельная функция, выполняющая что-то вроде for(int i=0;i<5;i ) yield return new Foo(); (IEnumerable — это не то же самое, что List), и это может повлиять на читаемость, так что это ситуативно, спорно, но в основном личные предпочтения.

3. ну, ты говоришь, что согласен, но в то же время ты вроде как и не согласен. Этот код не так прост даже для людей, знакомых с Linq, и автор не смог написать его сам. Этого уже должно быть достаточно. И если вы спросите меня, я скажу, что это похоже на взлом. Если вы считаете, что List — это не то же самое, что inemurable, вы можете преобразовать его в IEnumerable или использовать HashSet или какую-либо другую коллекцию, которая подходит вам для этой цели. Конечно, List НЕ является IEnumerable, потому что он наследует этот интерфейс, но не могли бы вы уточнить, что именно вы имеете в виду, говоря, что ‘IEnumerable — это не то же самое, что List’?

4. Лично я предпочитаю new object[5].Select(x => new Foo()) или Enumerable.Repeat("", 5).Select(x => new Foo())

5. @misterfrb но чтобы использовать new object[5] метод, вам нужно создать массив… Если бы нам понадобился очень большой IEnumerable, вам пришлось бы тратить память на создание массива, который вы не используете.