将LINQ ToList()的输出转换为List <t>子类</t>

时间:2014-07-11 17:33:48

标签: c# linq casting

我有一个扩展List的类:

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&lt; MyObject&gt;,它列出了正确分组的对象。

当我尝试将其转换为MyObjectList时,MyObjs最终为空。

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

如何使用correclty分组对象将MyObjs设为MyObjectList类型?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

您需要自己实例化并填写列表。至少有两种方法:

  1. 构造

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

    您必须将objs.ToList()来电替换为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;
        }
    }
    

    有了这个,您就不必更改代码,只要在文件中包含MyObjectListExtensions的命名空间即可。为什么?由于是非通用的,MyObjectListExtensions.ToList优先于Enumerable.ToList

    如果您不希望MyObjectList始终被实例化,您可以使用其他名称。