2010-12-07 95 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>);