2015-02-24 2 views
-4

Я видел этот вопрос (Using LINQ to concatenate strings), который работает для строк, но что произойдет, если я хотел бы объединить список строк, где строка является свойством класса?Использование Linq для конкатенации списка свойств классов

Метод, предложенный в этом вопросе, не работает (я пробовал).

Учитывая массив или людей, я хочу строку, содержащую конкатенацию их имен.

x => person.Name 

Как я могу решить эту проблему?

+0

использование '.select (х => x.Name)' или 'string.Join'. –

+2

Сделайте то же самое, что и связанный с ним вопрос, текущий и следующий - это объекты 'Person' вместо строк. –

+0

@CraigW .: он не работает, я уже пробовал. Я бы запретил любому, кто ниспослал его без каких-либо усилий. – Revious

ответ

5

Это сделает работу за вас:

var res = yourList.Select(x => x.Name).Aggregate((current, next) => current + ", " + next); 

Но я рекомендую вам использовать String.Join(string separator, IEnumerable<string> values):

var res = String.Join(", ", yourList.Select(x => x.Name)); 

Дополнительные данные:

Сказать правду в в таких ситуациях вы можете использовать либо Aggregate, либо String.Join(). Если мы проверим время выполнения обоих запросов, мы увидим, что второе быстрее первого. Но причина не в Aggregate() функции. Проблема в том, что мы конкатенируем строки в цикле. Это вызовет массу промежуточных строк, что приведет к отрицательному результату . Вы можете использовать StringBuilder.Append, если вы хотите по-прежнему использовать Aggregate и увеличить производительность:

var res = yourList.Select(x => x.Name) 
        .Aggregate(new StringBuilder(), (current, next) => current.Append(next).Append(", ")).ToString(); 

Но String.Join() использует StringBuilder внутренне уже и по этой причине он будет самым лучшим выбором.

+0

Использование 'Aggregate' будет иметь плохую производительность для коллекций с большим количеством элементов. – MarcinJuraszek

+0

@MarcinJuraszek Согласен. Итак, я показал OP 'String.Join' как второй вариант. –

2

Если это LINQ к объектам, вы должны использовать String.Join:

var result = String.Join(",", data.Select(x => x.MyProperty)); 
Смежные вопросы