2013-04-08 61 views
2

我对从名为Person的对象列表扩展而来的Class(PersonCollection)使用linq操作。扩展列表类中的linq操作

public class PersonCollection: List<Person> 
{ 
      //various functions 
} 

public class Person 
{ 
      public string name{ get; set; } 
      public string address { get; set; } 
} 

本来我是用字符串列表名单来存储这个类是由和LINQ操作将工作

List<List<String>> oldList = GetList(); 

    oldList = (List<List<string>>)oldList .OrderBy(s =>s[index_of_name]).ToList(); 

这会工作,但我显然想摆脱数据使用究竟是什么概念证明基本上是简单的代码

应用于这些新类的同一类型的LINQ操作不起作用:

people = (PersonCollection)orderedData.OrderBy(s => s.name]).ToList(); 

这是错误我得到:

Unable to cast object of type 'System.Collections.Generic.List`1[Person]' to type 'PersonCollection'. 

如果我投列出它的工作原理,就是用现在

people = (List<Person>)people .OrderBy(s => s.name]).ToList(); 

我想用我的PersonCollection类从扩展什么IM一个人名单,我的方法在哪里出错?无论是编码还是数据分类的一般选择

+2

只是好奇,为什么你必须直接从列表继承? – 2013-04-08 11:38:59

+0

或者为什么你需要一个集合(因此) - 当从'IEnumerable <>'抽取'到集合时 - 通常是这样 - 你只是用它来枚举。如果你发布更多的代码,我们可以帮助更多 – NSGaga 2013-04-08 12:44:09

+0

@CongLong这个想法是灵活性:它是一个类的人在列表中执行操作,所以我想我会扩大名单,这样我可以添加一些功能,这个类,并在需要时将linq操作应用到别处的类对象。此刻,考虑到我不得不投入人员名单,无论如何,我可能只是稍微拆散课堂,并将其设置为静态或将人员职能作为静态函数放置 – fullface 2013-04-09 08:16:58

回答

5

您的PersonCollectionList<Person>,但不是相反。

因此,您不能将List<Person>转换为PersonCollection。你必须创建类型的新对象PersonCollection

你可以用一个构造函数做到这一点:

public class PersonCollection : List<Person> 
{ 
    public PersonCollection(List<Person> list) 
    : base(list) 
    { 
    } 
} 

然后你可以从List<Person>

List<Person> list = people.OrderBy(s => s.name]).ToList(); 

PersonCollection pc = new PersonCollection(list); 
+0

这是我没有尝试过的,但本质上是与我的最后一块代码相同,但带有构造函数以导入到PersonCollection.Does我尝试将其转换为PersonCollection时出现错误,这意味着我错误地尝试这样做?如果是这样,我会恢复到一个人类,也许与静态函数处理列表操作...... – fullface 2013-04-08 15:53:18

1

构建PersonCollection作为附录尼古拉斯'回答,我会建议创建一个自定义扩展方法以允许更短的语法:

public static class MyListExtensions { 
    public static PersonCollection ToPersonCollection(this IEnumerable<Person> list) { 
     return new PersonCollection(list.ToList()); 
    } 
} 

作为一个附注,我会建议重新考虑一下你的术语:你的PersonCollection真的只是代表Collection还是真的List。这可能确实看起来很迂腐,但为了让您的代码更具可读性,通常有必要精确地指定。

+1

或只是'新的PersonCollection(列表) - OP可以从IEnumerable构造,他不需要列表。 – NSGaga 2013-04-08 12:42:37