2012-06-22 7 views
11

Tengo una lista de esta clase:Crear lista con sólo un miembro de la clase

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

Y quiero hacer un método que devuelve una lista de sólo la propiedad nombre. De esta manera:

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

Por lo tanto, si tengo esta lista:

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

quiero que el siguiente lista:

  1. name = Jon
  2. name = Jack

¿Es posible?

Respuesta

21

uso de LINQ:

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

rocas LINQ! Gracias. – Nick

+4

Como nota, si devuelve una lista , básicamente va a duplicar toda la lista. Esto puede tomar tiempo/memoria si tiene una lista grande. Si cambia a usar IEnumerable y luego no hace el .ToList(), obtendrá una lista perezosa que es casi libre de crear y consumirá muy poco (<100bytes) de espacio –

+2

@TimothyBaldridge: Verdadero. También vale la pena señalar que si vas por la ruta 'IEnumerable', se volverá a evaluar cada vez que iteres a través de él. Su IEnumerable también se ata al conjunto original de objetos, por lo que evitará que el recolector de basura limpie todos los objetos 'Datos', incluso si solo planea usar los nombres de ellos. Además, si 'MyDataList' cambia, el' IEnumerable' devuelto cambiará, y puede arrojar una excepción si se está utilizando en un hilo separado. A menudo, nada de esto importa, pero siempre es bueno entender lo que sucede bajo las sábanas. – StriplingWarrior

2

Si está utilizando .NET 3.5 (VS2008) o posterior a continuación, utilizar métodos de extensión:

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(); 
} 
Cuestiones relacionadas