LINQ: Когда использовать «новый» в предложении Select? - PullRequest
0 голосов
/ 05 декабря 2011

Когда требуется использовать new в предложении select, как в следующем примере? Спасибо.

var results = from person in people
              select new { FN = person.FirstName, LN = person.LastName };

Я искал и частично понимаю это: " В select new мы создаем новый анонимный тип только с необходимыми вам свойствами ." Но значит ли это, что я могу опустить новый и не получить анонимный тип?

Если перефразировать мой вопрос по-другому: «новое» не является обязательным? Является ли 'new' здесь похожим на C # new, где он не требуется с типом значения?

Могу ли я сделать это?

var results = from person in people
              select { FN = person.FirstName, LN = person.LastName };

Ответы [ 3 ]

1 голос
/ 05 декабря 2011

Вместо создания анонимного типа вы можете создать экземпляр именованного типа, который принимает Person в качестве аргумента, или назначать значения с использованием синтаксиса инициализатора объекта.

Пример:

var results = from person in people
              select new Report(person);

var results = from person in people
              select new Report() { Customer = person };

Редактировать: или, конечно, просто выбрать одно свойство из объекта person, как указывал BrokenGlass!

Редактировать: Я просто перечитал ваш вопрос и хотел указать, что анонимные типы в C # - это просто нормальные типы симя типа, сгенерированное компилятором.Так что да, вам все равно нужно использовать оператор new, потому что вы создаете новый экземпляр типа. Анонимные типы (Руководство по программированию в C #)

1 голос
/ 05 декабря 2011

Нет, new не является обязательным, если вы выбираете «новые» объекты. (это то, что вы делаете. Вы создаете новые объекты анонимного типа с 2 свойствами FN и LN)

Просто пропустить new - синтаксическая ошибка.

Если у вас есть существующий тип, который вы хотели бы использовать (например, вы определили class Person с 2 свойствами FN и LN), вы можете использовать этот тип. Э.Г.

var results = from person in people
              select new Person { FN = person.FirstName, LN = person.LastName };

(при условии, что Person имеет конструктор без параметров, а FN и LN - свойства с установщиками)

Единственный раз, когда вы можете опустить new, это если вы не создаете новый объект, например:

var results = from person in people
              select LN = person.LastName;

Там вы выбираете просто LastName, и в результате получается IEnumerable<string>

1 голос
/ 05 декабря 2011

Если вы проецируете на новый тип (анонимный класс или известный класс / структура), это необязательно, но обязательно.

Если вы проецируете на существующий экземпляр, хотя, конечно, вам не нужен new, т.е. в вашем примере, если вы просто хотите проецировать на имя каждого человека (чтобы получить перечисление строк, вы можете просто сделать:

var results = from person in people select person.FirstName

Так что практическое правило: если вы создаете новый тип, вам нужно новое в проекции (Select), если вы просто выбираете что-то, что уже существует, вы этого не делаете.

...