Относятся ли инициализаторы коллекций к LINQ в любом случае как инициализаторы объектов?
Я читаю о LINQ и вижу, как появляются Collection Initialzers, но действительно ли это напрямую связано с LINQ, как это делают Object Initializer?
List<string> stringsNew = new List<string> { "string 1", "string 2" };
2 ответа
Можно сказать, что инициализаторы коллекций связаны с Linq, поскольку вы можете поблагодарить Linq за то, что эта функция попала в C# 3. Если что-то случится со связанным вопросом, полезный текст
Целью разработки, мотивированной типичными сценариями использования для инициализаторов коллекций, было сделать возможной инициализацию существующих типов коллекций в синтаксисе выражений, чтобы инициализаторы коллекций могли быть встроены в понимание запросов или преобразованы в деревья выражений.
Любой другой сценарий имел более низкий приоритет; функция существует вообще, потому что она помогает заставить LINQ работать.
Эрик Липперт
Они полезны в контексте Linq, потому что они дают вам возможность писать вещи, как в примере ниже
var query = from foo in foos
select new Bar
{
ValueList = new List<string> { foo.A, foo.B, foo.C }
};
Где вы можете построить запрос, который проецирует данный foo
в Bar
со списком значений свойств foo. Без такой поддержки инициализатора вы не могли бы создать такой запрос (хотя вы могли бы превратить ValueList в массив статической длины и добиться чего-то подобного).
Но, подобно инициализаторам объектов и другим функциям, которые являются новыми в C# 3+, многие функции, вдохновленные или добавленные специально для обеспечения работы Linq, несомненно, полезны в коде, который вообще не имеет ничего общего с Linq, и не требуют, чтобы Linq работал (либо с помощью директивы using или ссылки на DLL). Инициализаторы, в конечном счете, являются не чем иным, как синтаксическим сахаром, который компилятор превратит в более длинный код, который вам пришлось бы писать самостоятельно в более ранних языковых версиях.
Инициализаторы объектов и коллекций не имеют ничего общего с LINQ - это совершенно не связанная языковая функция.
Любой класс с Add
метод, который реализует IEnumerable
можно использовать инициализатор коллекции. Элементы в фигурных скобках будут добавляться по одному, вместо того, чтобы повторно вызывать inst.Add(item1)
,