我有以下代码生成包含多个列表的字典;可以使用数字键检索每个列表。
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 })
但是我收到了类型转换错误。
答案 0 :(得分:5)
从Children
投射IGrouping<T>
到IEnumerable<T>
,或明确将通用参数传递给ToDictionary
电话。
g
参数是IGrouping<T>
,实现IEnumerable<T>
隐式通用调用最终会创建Dictionary<int, IGrouping<MyClass>>
,无法将其转换为Dictionary<int, IEnumerable<MyClass>>
。
IndexedGroup
类可以避免这种情况,因为其Children
属性明确键入为IEnumerable<MyClass>
。
例如:
return myList.Where(a => a.Group == group)
.GroupBy(n => n.GroupIndex)
.ToDictionary<int, IEnumerable<MyClass>>(g => g.Key, g => g);
击> <击> 撞击>
此外,您可能对ILookup<TKey, TElement>
interface感兴趣。
答案 1 :(得分:2)
您可以完全摆脱Select()
并致电.AsEnumerable()
:
return myList.Where(a => a.Group == group)
.GroupBy(n => n.GroupIndex)
.ToDictionary(g => g.Key, g => g.AsEnumerable());
或者您可以将返回类型更改为ILookup
,这基本上就是您要使用的数据结构:
public ILookup<int, MyClass> GetIndexedGroups(string group)
{
return myList.Where(a => a.Group == group)
.ToLookup(n => n.GroupIndex);
}
答案 2 :(得分:1)
以下情况如何?
return myList.Where(a => a.Group == group)
.GroupBy(n => n.GroupIndex)
.ToDictionary(g => g.Key, g => g as IEnumerable<MyClass>);