2014-07-11 55 views
1

我有一个扩展列表类:转换输出()列出<T>子

public class MyObjectList : List<MyObject> 
{ 
    ... 
} 

目前,有一个LINQ语句通过键值组:

MyObjectList objects = new MyObjectList(); //initializes and loads list 

var objectsByKey = objects.GroupBy(obj => obj.MyKey) 
          .Select(objs => new {MyKey = objs.Key, MyObjs = objs.ToList()}) 
          .ToList(); 

在输出中,MyObjs的类型为List < MyObject>,并列出了正确分组的对象。

当我尝试将它转换为MyObjectList时,MyObjs结束为空。

var objectsByKey = objects.GroupBy(obj => obj.MyKey) 
          .Select(objs => new {MyKey = objs.Key, MyObjs = objs.ToList() as MyObjectList}) 
          .ToList(); 

我怎样才能让MyObjs成为MyObjectList类型的对象分组对象?

+4

从'名单派生类'是一个不好的做法,正是这个原因,等等。如果你需要你的班级像列表一样行事,请执行'IList '。 –

+1

@ DanielMann点的冗长讨论发现在这里:http://stackoverflow.com/questions/21692193/why-not-inherit-from-listt – Ocelot20

回答

1

在你MyObjectList类,提供一个构造函数,像这样:

public class MyObjectList : List<MyObject> 
{ 
    public MyObjectList(IEnumerable<MyObject> list) 
     :base(list) 
    { 
    } 
} 

然后,选择你的对象时,像这样做:

var objectsByKey = objects.GroupBy(obj => obj.MyKey) 
          .Select(objs => new {MyKey = objs.Key, MyObjs = new MyObjectList(objs)}) 
          .ToList(); 
+0

lol,我刚刚添加了相同的答案。几乎一字一句。我会先删除你的,因为你先发布了你的帖子。我想这意味着我应该给你+1。 –

0

Enumerable.ToList(您正在使用的扩展方法)不知道您的自定义列表类型。 Casting不会转换它。

您需要自行实例化并填充列表。这样做有它至少有两种方式:

  1. 构造

    public MyObjectList(IEnumerable<MyObject> collection) : base(collection) {} 
    

    你必须与new MyObjectList(objs)

  2. 扩展方法

    public static class MyObjectListExtensions 
    { 
        public static MyObjectList ToList(this IEnumerable<MyObject> collection) 
        { 
         //You could also call the constructor described above 
         var list = new MyObjectList(); 
         list.AddRange(collection); 
         return list; 
        } 
    } 
    

    更换objs.ToList()通话有了这个,你不必改变你的代码,只要因为您在文件中包含了MyObjectListExtensions的命名空间。为什么?由于非通用,MyObjectListExtensions.ToList优先于Enumerable.ToList

    如果您不想MyObjectList始终实例化,您可以使用不同的名称。