2

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

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 类,我的方法哪里出错了?无论是编码还是数据分类方式的一般选择

4

2 回答 2

6

PersonCollection是一个List<Person>,但不是相反。

所以你不能将 aList<Person>转换为 a PersonCollection。您必须创建一个类型的新对象PersonCollection

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

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

然后你可以PersonCollection从 a 构造 aList<Person>

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

PersonCollection pc = new PersonCollection( list );
于 2013-04-08T11:41:59.303 回答
2

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

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

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

于 2013-04-08T12:08:28.770 回答