我可以为此 Linq 分组使用匿名类型吗?
我有以下代码,它生成一个包含多个列表的字典;每个列表都可以使用数字键检索。
public class myClass
{
public string Group { get; set; }
public int GroupIndex { get; set; }
...
}
public List<MyClass> myList { get; set; }
private Class IndexedGroup
{
public int Index { get; set; }
public IEnumerable<MyClass> Children { get; set; }
}
public Dictionary<int, IEnumerable<MyClass>> GetIndexedGroups(string group)
{
return myList.Where(a => a.Group == group)
.GroupBy(n => n.GroupIndex)
.Select(g => new IndexedGroup { Index = g.Key, Children = g })
.ToDictionary(key => key.Index, value => value.Children);
}
有什么方法可以消除 IndexedGroup
类吗?
我尝试过在 Select
方法中使用匿名类型,如下所示:
.Select(g => new { Index = g.Key, Children = g })
但我得到类型转换错误。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
将
Children
从IGrouping
转换为IEnumerable
,或显式将通用参数传递给ToDictionary
调用。g
参数是一个IGrouping
,它实现IEnumerable
。隐式泛型调用最终会创建一个
DictionaryIGrouping>
,它无法转换为Dictionary IEnumerable>
。IndexedGroup
类可以避免这种情况,因为其Children
属性显式键入为IEnumerable
。例如:另外,您可能对
ILookup接口
。
Cast
Children
fromIGrouping<T>
toIEnumerable<T>
, or explicitly pass generic parameters to theToDictionary
call.The
g
parameter is anIGrouping<T>
, which implementsIEnumerable<T>
.The implicit generic calls end up creating a
Dictionary<int, IGrouping<MyClass>>
, which cannot be converted to aDictionary<int, IEnumerable<MyClass>>
.This is avoided by your
IndexedGroup
class, since itsChildren
property explicitly typed asIEnumerable<MyClass>
.For example:Also, you may be interested in the
ILookup<TKey, TElement>
interface.您可以完全摆脱
Select()
并调用.AsEnumerable()
:或者您可以将返回类型更改为
ILookup
,这基本上就是您想要的数据结构:You could just get rid of the
Select()
entirely and call.AsEnumerable()
:Or you could change your return type to an
ILookup
, which is basically the data structure you're going for:下面的怎么样?
How about the following?