2016-04-25 36 views
0

我有問題可以忽略foreach循環中發生了什麼listOfBookedTimes successfuly獲取我想要的元素,但執行完下一行listOfBookedTimes後是空的。爲什麼? (所有列表中包含的DateTime)linq運行後列表爲空

foreach (var day in allDays) 
     { 
      list = Rep.GetListOfWorkingHours(fullDayWorkingHours, day, sPWorkingHours); 
      bookedTimes = _bookingsService.GetBookedTimes(day, providerId); 
      foreach (var b in bookedTimes) 
      { 
       var listOfBookedTimes = list.Where(m => m.TimeOfDay == (b.TimeOfAppointment.TimeOfDay)); 
       list.RemoveAll(m => m.TimeOfDay == (b.TimeOfAppointment.TimeOfDay)); 
       listOfBookedTimes.Select(m => m.Year - 50); 
       list.AddRange(listOfBookedTimes); 
      } 
+1

你正從'list'中刪除所有'listOfBookedTimes'。 –

回答

2

你的問題不是RemoveAll而是一個LINQ的fundemental理解和yield return.

當你調用

list.Where(m => m.TimeOfDay == (b.TimeOfAppointment.TimeOfDay)); 

它不被執行,而是返回的枚舉器將過濾迭代的集合。在下一行中,刪除您想要在前一行中獲取的所有條目。

當你終於遍歷集合中

list.AddRange(listOfBookedTimes); 

已經是空的。

解決方案:Where添加.ToArray().ToList()並預期它應該工作。像這樣:

var listOfBookedItems = list.Where(m => m.TimeOfDay == (b.TimeOfAppointment.TimeOfDay)) 
          .ToList(); 
3

您要刪除列表中的所有元素在此聲明

list.RemoveAll(m => m.TimeOfDay == (b.TimeOfAppointment.TimeOfDay)); 

通知,

listOfBookedTimes = list.Where(m => m.TimeOfDay == (b.TimeOfAppointment.TimeOfDay));

list.RemoveAll(m => m.TimeOfDay == (b.TimeOfAppointment.TimeOfDay));

具有相同的條件

你可以以獲取列表的新副本,因此從原來的list刪除項目會不會影響它執行ToList()

listOfBookedTimes = list.Where(m => m.TimeOfDay == (b.TimeOfAppointment.TimeOfDay)).ToList(); 

listOfBookedTimes仍然保留對list中原始項目的引用,因此在向這兩個列表添加刪除元素時不會相互影響,m這兩個列表中包含的單個項目的比例屬性將應用於它們兩個。

+0

@亞歷克斯藝術是的,但我把那個listOfBookedTimes將保持值,只有列表將被更改 – Zet

+0

看看更新的答案 –