将ienumerable linq列表转换为类型列表

时间:2009-12-16 19:49:36

标签: .net linq-to-objects

我遇到以下问题:

我正在使用linq以这种方式过滤一些数据:

var listPerson = (from objPerson in ListPerson
                                 select new
                                 {
                                     objPerson.IdPerson,
                                     objPerson.ApePerson,
                                     objPerson.NomPerson,
                                     objPerson.EdadPerson,
                                     objPerson.Gender
                                 }).Distinct();

一切正常,但问题是当我试图将listPerson List转换为

List<PersonClass>

我怎么能做那个演员?我试过了:

listPerson.ToList();

但它抛出一个异常(无法从IEnumerable转换为IEnumerable)。

提前致谢。我希望自己清楚明白。

4 个答案:

答案 0 :(得分:2)

您正在linq语句中创建匿名类型。您需要一种方法将该匿名类型的实例转换为PersonClass的实例。

如果ListPersonIEnumerable<PersonClass>,您应该能够ListPerson.Distinct().ToList()

答案 1 :(得分:1)

您拥有使用新的{...}语法创建的匿名类的实例集合。如果不将每个项目转换为PersonClass实例,则无法将其转换为 PersonClass 的实例列表。

答案 2 :(得分:1)

我假设您在PersonClass对象列表中使用linq,那么为什么不选择该对象。使用new关键字创建一个匿名类,它不是PersonClass。

var DistPerson = (from objPerson in ListPerson 
                  select objPerson).Distinct(); 

var DistPersonList = DistPerson.ToList();

答案 3 :(得分:1)

var listPerson的类型为IEnumerable&lt; COMPILERGENERATEDANONYMOUSTYPE&gt;,而不是IEnumerable&lt; PersonClass&gt ;.

而不是

select new
{
  objPerson.IdPerson,
  objPerson.ApePerson,
  objPerson.NomPerson,
  objPerson.EdadPerson,
  objPerson.Gender
}

做的:

select new PersonClass()
{
  IdPerson = objPerson.IdPerson,
  // etc
}

如果你真的需要那里的匿名类型,并在以后将其转换为列表,那么你可以做另一个选择:

listPerson.Select(p => new ListPerson() { IdPerson = p.Person, /* ... */ });

listPerson.Select(p => new ListPerson(p.Person, /* ... */ ));