2012-06-22 12 views
11

Ho una lista di questa classe:Crea elenco con un solo membro della classe

public class Data 
{ 
    public string name {get; set;} 
    public int width {get; set;} 
} 

E voglio fare un metodo che restituisce un elenco di solo la proprietà nome. Come questo:

public List<string> GetAllNames() 
{ return MyDataList<name>.ToList(); } 

Quindi, se ho questa lista:

  1. name = Jon - width = 10
  2. name = Jack - width = 25

voglio il lista seguente:

  1. name = Jon
  2. name = Jack

E 'possibile?

risposta

21

utilizzare LINQ:

public List<string> GetAllNames() 
{ 
    return MyDataList.Select(i => i.name).ToList(); 
} 
+1

rocce LINQ! Grazie. – Nick

+4

Come nota, se si restituisce una lista allora si sta per duplicare sostanzialmente l'intero elenco. Questo può richiedere tempo/memoria se si dispone di un elenco di grandi dimensioni. Se si passa a IEnumerable e quindi non si esegue .ToList(), quindi si otterrà un elenco pigro che è quasi gratuito da creare e consumerà molto poco (<100bytes) di spazio –

+2

@TimothyBaldridge: True. Vale anche la pena notare che se si utilizza la route 'IEnumerable', verrà rivalutata ogni volta che si esegue iterazione su di essa. Anche il tuo IEnumerable è legato al set originale di oggetti, quindi impedirà al garbage collector di ripulire tutti gli oggetti 'Data' anche se si prevede di utilizzare solo i nomi da essi. Inoltre, se 'MyDataList' cambia, l'' IEnumerable' restituito verrebbe modificato e potrebbe generare un'eccezione se viene utilizzato in un thread separato. Spesso niente di tutto ciò è importante, ma è sempre bene capire cosa sta succedendo sotto le coperte. – StriplingWarrior

2

Se si sta utilizzando .NET 3.5 (VS2008) o versione successiva quindi utilizzare metodi di estensione:

public class Data { String Name; Int32 Width; } 
public List<Data> MyData = new List<Data>(); 

public static IEnumerable<String> GetNames(this List<Data> data) { 
    foreach(Data d in data) yield return d.Name; 
} 
// or use Linq to return a concrete List<String> implementation rather than IEnumerable. 
2
public List<string> GetAllNames() 
{ 
    return myDataList.Select(item => item.name).ToList(); 
} 
Problemi correlati