Если у вас есть класс:
class Foo {
Bar Bar { get; } = new Bar();
}
class Bar {
string Prop {get; set; }
}
Вы можете использовать инициализацию объекта, например:
var foo = new Foo {
Bar = { Prop = "Hello World!" }
}
Если у вас есть класс
class Foo2 {
ICollection<Bar> Bars { get; } = new List<Bar>();
}
Ты можешь написать
var foo = new Foo2 {
Bars = {
new Bar { Prop = "Hello" },
new Bar { Prop = "World" }
}
}
но я хотел бы написать что-то вроде
var items = new [] {"Hello", "World"};
var foo = new Foo2 {
Bars = { items.Select(s => new Bar { Prop = s }) }
}
Однако приведенный выше код не компилируется:
не может назначить IEnumerable на панель
Я не могу писать:
var foo = new Foo2 {
Bars = items.Select(s => new Bar { Prop = s })
}
Панели свойств доступны только для чтения.
Это можно заархивировать?
Bars.Add
для каждого отдельного элемента, если все, что у вас есть, этоICollection
. Инициализаторы объектов — это всего лишь синтаксическое сокращение; C#, как правило, опасается добавлять синтаксис, который увеличивает нагрузку во время выполнения, и предпочитает, чтобы вы говорили об этом явно (конечно, есть исключения). - person Jeroen Mostert   schedule 22.11.2018