2010-09-29 14 views
17

Mam klasyCollection ciąg przy użyciu 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" }); 

Chciałbym uzyskać ciąg z separatora przecinka lastName, przy użyciu LINQ, wynik wygląda tak: AA, BB

Dzięki,

+0

.NET 3.5 lub 4.0? –

Odpowiedz

42

Jeśli używasz .NET 4:

string lastNames = string.Join(",", PersonList.Select(x => x.LastName)); 

Jeśli używasz .NET 3.5:

string lastNames = string.Join(",", PersonList.Select(x => x.LastName) 
               .ToArray()); 

(Zasadniczo .NET 4 miał kilka dodatkowych przeciążeń dodany do string.Join.)

7

Można użyć

PersonList.Select(p => p.LastName).Aggregate((s1,s2) => s1 + ", " + s2); 
+0

Ładna alternatywa! –

8

do łączenia elementów ciągów, z separatorami, można użyć String.Join

W .NET 3.5 i poniżej, zajmuje to drugi parametr, ale w wersji 4.0 ma przeciążenie, które zajmuje IEnumerable<T>, gdzie T w tym przypadku to String.

Uzbrojony w te informacje, oto kod, który chcesz.

NET 3.5:

string result = String.Join(", ", 
    (from p in PersonList 
    select p.LastName).ToArray()); 

dla .NET 4.0 można pominąć wezwanie do ToArray:

string result = String.Join(", ", 
    from p in PersonList 
    select p.LastName); 

Jeśli chcesz upuścić-składni LINQ i po prostu używać rozszerzenia LINQ metody, tutaj jest to samo w tym wariancie:

NET 3.5:

string result = String.Join(", ", PersonList.Select(p => p.LastName).ToArray()); 

dla .NET 4.0 można pominąć wezwanie do ToArray:

string result = String.Join(", ", PersonList.Select(p => p.LastName)); 

Uwaga: Do 3,5 powyższych wariantów oczywiście działa w wersji 4.0, a także, że nie usunąć lub zastąpić stary sposób, po prostu dodano jeden typowy przypadek.

Powiązane problemy