2011-07-11 288 views
4

假设以下类:从对象数组中检索属性的数组

class Person 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 

假设我有一个Person对象的列表或数组。有没有办法使用LINQ从所有数组元素中检索FirstName属性并返回一个字符串数组。我有一种感觉,我以前见过这样的东西。

希望这个问题有意义。

回答

10

当然,很容易:

Person[] people = ...; 
string[] names = people.Select(x => x.FirstName).ToArray(); 

,除非你真的需要结果是一个数组,虽然,我会考虑使用ToList()代替ToArray(),并有可能只是把它当作一个惰性计算IEnumerable<string>(即只是请致电Select)。这取决于你将如何处理结果。

+0

HAA!而已? – Skadoosh

+1

@KP:是的。 LINQ岩石。 –

3

如果你有一个阵列,然后就个人而言,我会使用:

Person[] people = ... 
string[] names = Array.ConvertAll(people, person => person.FirstName); 

这里;它避免了一些重新分配,并在更多版本的.NET上工作。同样:

List<Person> people = ... 
List<string> names = people.ConvertAll(person => person.FirstName); 

LINQ将工作,但实际上并不需要这里

+0

+1用于演示,但个人而言,我可能仍会使用LINQ--因为它现在可以说更具惯用性,并且在面对不断变化的需求或改变输入类型时会更加灵活。我会在性能敏感的代码中使用'Array.ConvertAll',当然也可以使用.NET 2.0。 –

1

试试这个:

List<Person> people = new List<Person>(); 
people.Add(new Person() 
    { 
     FirstName = "Brandon", 
     LastName = "Zeider" 
    }); 
people.Add(new Person() 
{ 
    FirstName = "John", 
    LastName = "Doe" 
}); 

var firstNameArray = people.Select(p => p.FirstName).ToArray(); 
+0

你可以使你的设置代码相当简单,使用对象和集合初始值设定项:) –

+0

你当然是对的乔恩(你不是总是哈哈)。如果我的浏览器刷新了,我会看到你和Marc已经回答了,我不会感到困扰。 :) – BrandonZeider