Относятся ли инициализаторы коллекций к 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),

Другие вопросы по тегам