2016-04-25 4 views
0

foreachで何が起こっているのかを知るために問題がありますloop-listOfBookedTimes successfulyは、必要な要素を取得しますが、次の行の実行後には、リストの空きリストは空です。どうして?あなたはこの声明の中で、リストからすべての要素を削除する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

あなたの問題は、あなたがそれを実行するのではなく反復でコレクションをフィルタリングします列挙子を返していない

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

を呼び出すとRemoveAllではなく、きゅうのfundemental理解とyield return.

。次の行で、前の行でフェッチしたいすべてのエントリを削除します。

あなたが最後に

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));

01その

listが、それには影響しませんから項目を削除するようにするには、リストの新しいコピーを取得するためにToList()を実行することができ、同じ条件に

を持っている:

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

しかし

listOfBookedTimesは、listの元のアイテムへの参照を保持しています。そのため、両方のリストに削除要素を追加しても相互に影響はありません。両方のリストに含まれている単一の項目の属性を保存することは、両方の項目に適用されます。

+0

@ Alex Artはい、私はそのリストを手に入れました.OfBookedTimesは値を保持し、リストのみが変更されます – Zet

+0

更新された答えを見てください –