linq对扩展列表类的操作

时间:2013-04-08 11:37:08

标签: c# linq list

我对类(PersonCollection)使用linq操作,该类是从名为Person的对象List扩展而来。

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'.

如果我施放到List它可以工作,那就是我现在正在使用的

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

我想使用从人员列表扩展的PersonCollection类,我的方法在哪里出错了?无论是编码还是一般选择如何分类数据

2 个答案:

答案 0 :(得分:5)

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

因此,您无法将List<Person>投射到PersonCollection。您必须创建PersonCollection

类型的新对象

您可以使用构造函数执行此操作:

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

然后,您可以从PersonCollection

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

PersonCollection pc = new PersonCollection( list );

答案 1 :(得分:1)

作为Nicholas回答的附录,我建议创建一个自定义扩展方法,以允许更短的语法:

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

作为旁注,我建议您重新考虑您的术语:您的PersonCollection是真的只代表Collection还是真实的List。这可能看起来很迂腐,但为了使代码更具可读性,通常值得真正精确命名。