Сбор в строку с использованием linq
У меня есть класс
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
List<Person> PersonList = new List<Perso>();
PersonList.Add(new Person() { FirstName = "aa", LastName = "AA" } );
PersonList.Add(new Person() { FirstName = "bb", LastName = "BB" } );
Я хотел бы получить строку с разделителем запятой для LastName, используя Linq, результат будет выглядеть так:
AA, BB
Спасибо,
Ответы
Ответ 1
Если вы используете .NET 4:
string lastNames = string.Join(",", PersonList.Select(x => x.LastName));
Если вы используете .NET 3.5:
string lastNames = string.Join(",", PersonList.Select(x => x.LastName)
.ToArray());
(В основном у .NET 4 были дополнительные перегрузки, добавленные в string.Join
.)
Ответ 2
Чтобы объединить строковые элементы с разделителями, вы можете использовать String.Join
В .NET 3.5 и ниже это берет массив как второй параметр, но в 4.0 он имеет перегрузку, которая принимает IEnumerable<T>
, где T
в этом случае String
.
Вооружившись этой информацией, введите код, который вы хотите.
Для .NET 3.5:
string result = String.Join(", ",
(from p in PersonList
select p.LastName).ToArray());
Для .NET 4.0 вы можете опустить вызов ToArray:
string result = String.Join(", ",
from p in PersonList
select p.LastName);
Если вы хотите отказаться от LINQ-синтаксиса и просто использовать методы расширения LINQ, здесь то же самое в этом варианте:
Для .NET 3.5:
string result = String.Join(", ", PersonList.Select(p => p.LastName).ToArray());
Для .NET 4.0 вы можете опустить вызов ToArray:
string result = String.Join(", ", PersonList.Select(p => p.LastName));
Примечание: 3.5 варианта выше, конечно, работают и в 4.0, они не удалили или не заменили старый метод, они просто добавили один для типичного случая.
Ответ 3
Вы можете использовать
PersonList.Select(p => p.LastName).Aggregate((s1,s2) => s1 + ", " + s2);