2010-05-20 67 views
0

如果給定具有日期和小數的對象列表,我希望按日期的年份,月份,日期和小時爲這些對象編制索引。在.NET 2.0中,我將使用一組嵌套字典和一個列表作爲葉節點創建此圖。我對如何用LINQ完成這項工作感興趣。如何爲對象集合創建嵌套的LINQ分組/查找

回答

1

你的意思是這樣嗎?

var grouping = from item in myList 
       group item by new { item.Date.Year, item.Date.Month, item.Date.DayOfWeek, item.Date.Hour } 
       into groupedItems 
       select groupedItems; 
+0

使用匿名類型意味着您不能將此分組傳遞給任何其他類或函數。我認爲最好爲你的密鑰創建一個特定的類,這樣分組可以用於項目範圍... – 2010-05-20 16:12:06

+0

真的,你不能傳遞它,但我會留下創建該類,直到我知道我需要傳遞它。如果不知道它是否將用作LinqToSql查詢的一部分,我也會猶豫是否將它用作密鑰的替換。 – 2010-05-20 16:37:06

+0

完美的作品。我目前不需要傳遞它,但我會記住spec index類以備將來參考。 – 2010-05-20 17:03:09

1

讓我們假設你有DateTime和十進制屬性的類...

public class SomeThingWithDateAndDecimal 
{ 
    public DateTime SomeDate { get; set; } 
    public decimal SomeDecimal { get;set; } 
} 

如果我是你,我會爲你的鑰匙像這樣一類...

public class IndexKey 
{ 
    public int Year { get; set; } 
    public int Month { get; set; } 
    public DayOfWeek DayOfWeek { get; set; } 
    public int Hour { get; set; } 

    public IndexKey(DateTime dt) 
    { 
     Year = dt.Year; 
     Month = dt.Month; 
     DayOfWeek = dt.DayOfWeek; 
     Hour = dt.Hour; 
    } 

然後從您的列表中做這樣的事情...

public static void Main() 
{ 
    var l = new List<SomeThingWithDate>(); 

    //Fill the list with stuff... 

    var indexed = l.ToLookup(o => new IndexKey(o.SomeDate)); 
} 

這不是嵌套的,但是你可以用嵌套字典做任何事情,你可以用這個結構來做。有些東西你很難做的嵌套字典變得更簡單,如部分密鑰查找,即「獲取所有的值與小時== 2」。