2013-03-07 47 views
0

在過去的幾個小時中,我一直在困擾這個問題,我希望你能幫助我。將列表<T>的部分拆分爲2列表<T>和加入這些2

我有一個填充數據的列表(請參閱class:allItems),但我想拆分數據,因此類項目將其所有項與持有子項的項列表中的公共列表保持在一起。

在這段代碼中會發生什麼:在for循環中,項目被添加了與天列表相同的值,這就是我試圖將正確數量的條目添加到天列表中的位置,在allStats列表中顯示同一周的數字。

任何幫助,將不勝感激,謝謝。

public class allItems 
{ 
    public DateTime PunchInDate { get; set; } 
    public DateTime PunchOutDate { get; set; } 
    public DayOfWeek DayOfWeek { get; set; } 
    public int WeekNumber { get; set; } 
    public int MonthNumber { get; set; } 
    public bool PunchedInLate { get; set; } 
    public bool PunchedOutLate { get; set; } 
} 
public class items 
{ 
    public int WeekNumber { get; set; } 
    public int MonthNumber { get; set; } 
    public List<subItems> Days { get; set; } 
} 
public class subItems 
{ 
    public bool PunchedInLate { get; set; } 
    public bool PunchedOutLate { get; set; } 
    public DateTime PunchInDate { get; set; } 
    public DateTime PunchOutDate { get; set; } 
    public DayOfWeek DayOfWeek { get; set; } 
} 
protected int getNumberOfWeeks(List<allItems> list, int numberToFind) 
{ 
    List<allItems> results = list.FindAll(
     delegate(allItems ai) 
     { 
      return ai.WeekNumber == numberToFind; 
     } 
     ); 
    return results.Count; 
} 
public List<items> getStats(string userId, string type) 
{ 
    List<allItems> allStats = getAllStats(userId, "week"); 
    List<items> stats = new List<items>(); 

    foreach (allItems allItem in allStats) 
    { 
     items item = new items(); 
     subItems subItem = new subItems(); 
     List<subItems> Days = new List<subItems>(); 

     item.MonthNumber = allItem.MonthNumber; 
     item.WeekNumber = allItem.WeekNumber; 
     item.Days = Days; 

     int numberOfWeeks = getNumberOfWeeks(allStats, allItem.WeekNumber); 
     for (int i = 0; i < numberOfWeeks; i++) 
     { 
      subItem.DayOfWeek = allItem.DayOfWeek; 
      subItem.PunchedInLate = allItem.PunchedInLate; 
      subItem.PunchedOutLate = allItem.PunchedOutLate; 
      subItem.punchInDate = allItem.PunchInDate; 
      subItem.PunchOutDate = allItem.PunchOutDate; 

      Days.Add(subItem); 
     } 

     items result = stats.Find(week => week.WeekNumber == allItem.WeekNumber); 

     if (result == null) 
     { 
      stats.Add(item); 
     } 
    } 

    return stats; 
} 
+3

請使用'C#'命名約定。屬性名稱應該是'ProperCased'(I.E'PunchInDate'而不是'punchInDate')。你的代碼看起來像java,這會傷害我的眼睛(和胃) – 2013-03-07 15:31:23

+0

請記住這一點以備將來參考,謝謝。 – mackwerk 2013-03-07 15:38:45

+0

@highcore我們需要在某個時間喝點飲料;我有一種感覺,我們要麼相處得很好,要麼進入戰鬥。 :) – JerKimball 2013-03-07 15:39:48

回答

3

聽起來像是你可以做到這一點使用LINQ:

var allItemsList = new List<allItems>() { ... fill in items ... }; 
var asItems = 
    from item in allItemsList 
    group item by new { week = item.weekNumber, month = item.monthNumber } into byWeekMonth 
    select new items() 
    { 
     weekNumber = byWeekMonth.Key.week, 
     monthNumber = byWeekMonth.Key.month, 
     days = byWeekMonth.Select(si => 
      new subItems() 
      { 
       punchedInLate = si.punchedInLate, 
       punchedOutLate = si.punchedOutLate, 
       // etc, other fields 
      }).ToList() 
    }; 
+0

'key'在intellisense中給出了這個錯誤''Statistics.allItems'沒有包含'Key'的定義,沒有'Key'的擴展方法接受'Statistics.allItems'類型的第一個參數'可以找到(你是否錯過了使用指令或程序集引用?)' 雖然,如果那小塊代碼可以完成這個技巧,可能會很可愛。 – mackwerk 2013-03-07 15:50:01

+0

@KasperMackenhauerJacobsen嘿 - 不,我只是輸入太快而且錯誤 - 嘗試更新的版本。 :) – JerKimball 2013-03-07 15:56:46

+0

非常感謝!我真的需要學習linq,但這不是課程的一部分,我認爲這是愚蠢的! 無論如何,美麗的答案,再次感謝! – mackwerk 2013-03-07 16:11:09