如何转换
public class MyCustomList: List<MyCustomList>
回到MyCustomList
?
myCustomListObject = myCustomListObject.OrderBy(...);
我尝试.ToList() as myCustomListObject
,返回null。我该怎么办?
答案 0 :(得分:2)
问题是ToList()将返回一个List。您无法将其转换为MyCustomList,就像您无法转换其他对象一样。
List<string> result = myCustomListObject.OrderBy(...).ToList();
如果你真的需要MyCustomListObject,你应该创建一个接受显式强制转换操作的构造函数。
如果MyCustomList只是List&lt; string&gt;的另一个名称。你可以使用:
using MyCustomList = List<string>;
然后它会像你想要的那样工作。
答案 1 :(得分:2)
public class MyCustomList: List<MyCustomList>
{
//stuff you already have here, including your current constructors
public MyCustomList(IEnumerable<MyCustomList> source)
{
//something here that (perhaps after using `this` to call
//one of the existing constructors, loads all of the items
//in source into it. There may be optimisations available
//in particular cases, as a bonus.
}
}
如果您真的希望能够执行ToList()
样式之类的操作,那么您可以添加:
public static class MyBigOClassOHelpfulStaticMethods //maybe pick a better name
{
public static MyCustomList ToMyCustomList(this IEnumerable<MyCustomList> source)
{
return new MyCustomList(source);
}
}
与ToList()
的工作方式相差不远。
所有这些都表示,如果你经常用新的MyCustomList
写一个Sort
,那么通过调用OrderBy
代替{{1}可以获得一些好处},因为Sort
会对列表进行排序。
答案 2 :(得分:1)
OrderBy
的返回值不是MyCustomList
的实例,也不是ToList
的返回值。因此,您无法将其投射到MyCustomList
。
您唯一的选择是:
MyCustomList
的新实例并添加OrderBy
返回的元素。MyCustomList
返回的元素替换OrderBy
实例的当前竞争对手。在不了解您的MyCustomList
课程的情况下,不可能多说些什么。但是,由于它继承自List<MyCustomList>
,因此可以假设上述两个选项都是可行的。
答案 3 :(得分:1)
我同意O. R. Mapper的意见,在不了解MyCustomList的情况下,很难回答。但你可以做一些像这样简单的事情(再次,不知道更多,现在可能会有效):
void Main()
{
var list = new MyList() { new Stuff() { ugg = "z" }, new Stuff() { ugg = "b" } };
var myOrderedList = list.OrderBy(s => s.ugg);
myOrderedList.ToList().Dump();
var list2 = new MyList();
list2.AddRange(myOrderedList);
list2.GetType().Name.Dump();
}
public class Stuff{
public string ugg {get;set;}
}
// Define other methods and classes here
public class MyList : List<Stuff>{
}
我使用LinqPad使用Dump()
扩展方法显示内容和类型名称。