2013-03-18 82 views
0

我有一個名爲FrameList的自定義對象(PO​​NO)的數組,我可以orderBy和GroupBy進行排序和分組。但現在我想回到一個字典,而我得到的錯誤:(順便說一句,有沒有錯誤是我刪除了.ToDictionary()方法)Linq排序,分組和返回字典

Error 1 'System.Linq.IGrouping' does not contain a definition for 'type' and no extension method 'type' accepting a first argument of type 'System.Linq.IGrouping' could be found (are you missing a using directive or an assembly reference?) C:\Users\ysg4206\Documents\Visual Studio 2010\Projects\Watson\CatalogServiceClasses\BuildToby.cs 21 38 Watson

這裏是代碼段中排序和組:

var dict = request.FrameList.OrderBy(f => f.trueDate) 
     .GroupBy(f => f.type) 
     .ToDictionary(f => f.type, f => f); 

和這裏是頁框的定義(這是FrameData的一個簡單的數組)

[DataContract] 
public class FrameData 
{ 
    [DataMember] 
    public String idx { get; set; } 
    [DataMember] 
    public String type { get; set; } 
    [DataMember] 
    public String path { get; set; } 
    [DataMember] 
    public String date { get; set; } 
    [DataMember] 
    public DateTime trueDate { get; set; } 
} 
+0

'.ToDictionary(F => f.Key,F => F)'的IGrouping將組中的元素按類型分爲關鍵。 – Romoku 2013-03-18 16:35:31

回答

3

目前尚不清楚你在做什麼試圖去做。

如果你只是希望建立一個地道的多圖,嘗試:

var lookup = request.FrameList.ToLookup(f => f.type); 

如果你正在尋找創建多圖與Dictionary類,嘗試:

var dict = request.FrameList 
        .GroupBy(f => f.type) 
        .ToDictionary(g => g.Key, g => g.ToList()); 

請注意,在這兩種情況下,分組之前的OrderBy是無用的,因爲查找和字典本身是無序集合。如果您正在嘗試通過訂購來完成某項任務(也許您希望某個組中的項目按日期排序?),請澄清一下,並且我們可能會提供更適合的項目。

編輯:基於您的評論,看起來像你需要:

var dict = request.FrameList 
        .GroupBy(f => f.type) 
        .ToDictionary(g => g.Key, 
           g => g.OrderBy(f => f.trueDate) 
             .ToList()); 
+0

+1使用'ToLookup'。達姆,我忘了它... – 2013-03-18 16:44:27

+0

是的,這是我一直在尋找。謝謝。 OrderBy不需要對組(或dictonary元素)進行排序,而是需要將每個鍵上的List作爲排序列表(按日期)。這就是訣竅。 – 2013-03-18 16:44:47

1

假設你的方法簽名是IDictionary<string,IList<FrameData>>

嘗試使用下面的代碼片段:

var dict = request.FrameList 
    .OrderBy(f => f.trueDate) 
    .GroupBy(f => f.type) 
    .ToDictionary(f => f.Key, f => f.ToList()); 
+0

編輯? ;) – 2013-03-18 16:37:32

+0

@lazyberezovsky我很困惑的評論回答:) – 2013-03-18 16:38:04

1

的GroupBy運算符返回IGrouping對象。這些對象具有Key屬性。但沒有type屬性分組對象(這是你的實體的屬性):

var dict = request.FrameList 
     .OrderBy(f => f.trueDate) 
     .GroupBy(f => f.type) // this selects IEnumerable<IGrouping> 
     .ToDictionary(g => g.Key, g => g); 

注意:如果這是一個LINQ到實體查詢,然後GroupBy返回IQueryable<IGrouping<TKey, TElement>>