2012-08-16 11 views
17

Diciamo che ho questo oggetto:In C#, esiste un modo "facile" per eseguire string.Join su un elenco di tipi complessi?

public class Role { 
    public string Name { get; set; } 
    public string Slug { get; set; } 
    public DateTime DateAssigned { get; set; } 
    ... 
} 

Un membro può disporre di più ruoli: member.Roles = List<Role>();

Se volevo unirmi ruoli del membro in un elenco separato da virgole dei nomi di ruolo, c'è un facile modo (simile a string.Join(",", member.Roles); - che non funziona perché un ruolo è un tipo complesso)?

+0

Forse usando qualcosa come 'member.Roles.Select (x = > x.Nome) .ToList () '? –

risposta

44
using System.Linq 

string.Join(",", member.Roles.Select(r => r.Name)) 
+0

Questo è ciò che intendevo =) +1 –

+4

'using System.Linq' –

+1

rock on, grazie per la risposta molto veloce (e il colonnello Panic per l'istruzione using!) – Chaddeus

5

Sì, è possibile utilizzare il sovraccarico di String.Join (nuova in .NET 4) che prende un IEnumerable<String> e un po 'di Linq:

String joined = string.Join(",", member.Roles.Select(r => r.Name)); 
2

Un altra possibilità è quella di ridefinire il metodo ToString() della classe per restituire ciò che si desidera e quindi rilasciare questa istruzione.

var joined = string.Join(",", member.Roles) 
8

Se si desidera solo la proprietà Name, poi altre risposte sono buone

Ma se si dispone di più proprietà, regolare il ToString() per abbinare:

public override String ToString() 
{ 
    return String.Format("Name: {0}. Slug : {1}", Name, Slug); 
} 

ecc e poi chiamare come

String.Join(", ", member.Roles); 

non avrebbe bisogno di chiamare

String.Join(", ", member.Roles.Select(x => x.ToString()) 

come sarebbe chiamato internamente da oggetto all'interno String.Join(), quindi se si ignora ToString(), basta chiamare

String.Join(", ", member.Roles); 
+0

Awesome, grazie per il suggerimento! – Chaddeus

+1

Semplicemente elegante. +1 –

+0

@ DanielMarín: Grazie :) –

Problemi correlati