我有一个扩展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类型?
答案 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
(您正在使用的扩展方法)不了解您的自定义列表类型。施法不会转换它。
您需要自己实例化并填写列表。至少有两种方法:
构造
public MyObjectList(IEnumerable<MyObject> collection) : base(collection) {}
您必须将objs.ToList()
来电替换为new MyObjectList(objs)
扩展方法
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
始终被实例化,您可以使用其他名称。