将IOrderedEnumerable转换回自定义列表<t> </t>

时间:2012-08-26 17:10:36

标签: c#

如何转换

public class MyCustomList: List<MyCustomList>

订购后

回到MyCustomList

myCustomListObject = myCustomListObject.OrderBy(...);

我尝试.ToList() as myCustomListObject,返回null。我该怎么办?

4 个答案:

答案 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()扩展方法显示内容和类型名称。