我对类(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类,我的方法在哪里出错了?无论是编码还是一般选择如何分类数据
答案 0 :(得分:5)
您的PersonCollection
是List<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
。这可能看起来很迂腐,但为了使代码更具可读性,通常值得真正精确命名。