我可以为此Linq分组使用匿名类型吗?

时间:2010-12-07 18:18:37

标签: c# linq grouping anonymous-types

我有以下代码生成包含多个列表的字典;可以使用数字键检索每个列表。

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 })

但是我收到了类型转换错误。

3 个答案:

答案 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>);