2010-12-07 96 views
4

我有下面的代码,它产生一个包含多个列表的字典;每个列表都可以用数字键来检索。我可以为此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 }) 

但我得到一个类型转换错误。

+0

顺便说一句,如果您发布了确切的错误消息,那么对于简单的人来说就可能发现问题了。 – SLaks 2010-12-07 18:26:51

+0

@SLaks。错误消息是针头上的圣经,我正在开发一台未连接到互联网的计算机。 – 2010-12-07 18:29:15

+0

确实;这将是一个长期的信息。 _为什么你在没有连接到互联网的计算机上开发? – SLaks 2010-12-07 18:30:04

回答

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

铸造ChildrenIGrouping<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

以下情况如何?

return myList.Where(a => a.Group == group) 
      .GroupBy(n => n.GroupIndex) 
      .ToDictionary(g => g.Key, g => g as IEnumerable<MyClass>);