Относятся ли инициализаторы коллекций к LINQ в любом случае как инициализаторы объектов? - PullRequest
1 голос
/ 02 декабря 2011

Я читаю о LINQ и вижу, что появятся Collection Initialzers, но действительно ли это напрямую связано с LINQ, как это делают Object Initializer?

List<string> stringsNew = new List<string> { "string 1", "string 2" };

Ответы [ 2 ]

3 голосов
/ 02 декабря 2011

Можно сказать, что инициализаторы коллекции связаны с 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). Инициализаторы, в конечном счете, являются не более чем синтаксическим сахаром, который компилятор превратит в более длинный код, который вам пришлось бы писать самостоятельно в более ранних языковых версиях.

0 голосов
/ 02 декабря 2011

Инициализаторы объектов и коллекций не имеют ничего общего с LINQ - это совершенно не связанная языковая функция.

Любой класс с методом Add, который реализует IEnumerable, может использовать инициализатор коллекции. Элементы в фигурных скобках будут добавляться по одному, вместо того, чтобы повторно вызывать inst.Add(item1).

...