2014-11-20 248 views
0

我需要從HttpSession集合中刪除項目。在以下代碼中,myList包含與Session相同的項目。如果myList/Session中的項目不在itemsToRemove中,則應從會話集合中刪除它們。如何在List.ForEach()中使用條件?

但是,我不確定lambda語法應該是什麼樣子。以下是不正確的。

myList.ForEach(x => !itemsToRemove.Contains(x) { Session.Remove(x) }); 

任何想法如何使用lambda表達式將所有內容放在一行上來完成此任務?

另外,有沒有辦法避免創建中間列表(myList)?我只是這樣做,因爲我無法從Session中刪除項目,而迭代它。

回答

7

最簡單的方式:

myList.Where(x => !itemsToRemove.Contains(x)) // LINQ extension method 
     .ToList()                 <---- 
     .ForEach(x => Session.Remove(x));  // List<T> method so this is required | 

您也可以使用此:

mystList.Except(itemsToRemove) 
     .ToList() 
     .ForEach(x => Session.Remove(x)); 

但使用ForEach底層的類型應該是List<T>,所以你需要調用ToList()第一。什麼導致整個集合的過度枚舉。

我會做這個:

foreach (var x in mystList.Except(itemsToRemove)) 
{ 
    Session.Remove(x) 
} 

這將最大限度地減少枚舉數。

+0

從哪裏來?我使用的是列表,但沒有看到。 – 4thSpace 2014-11-20 22:47:04

+0

@ 4thSpace:使用System.Linq添加'' – abatishchev 2014-11-20 22:47:36

+0

太棒了!謝謝。 – 4thSpace 2014-11-20 22:48:22

0

首先,abatischev的回答非常好。從性能角度和可讀性角度來看,它都是理想的。但是,如果你真的補習班的所有功能集成到一個聲明(我不推薦),你可以嘗試以下方法:

Session.OfType<string>() 
     .Except(itemsToRemove) 
     .ToList() 
     .ForEach(x => Session.Remove(x)); 

由於abatischev metnioned,該ToList()通話費用你一個額外的通過集合進行枚舉,如果集合中有大量元素,可能會產生不小的性能影響。但是,這意味着在新創建的List<string>,填補你的myList的作用,並允許您從會話中移除項(因爲你通過臨時列表進行迭代,而不是會議)的ForEach()調用迭代。

(請注意,我還沒有和HttpSessionState對象自己,只是看着自己的MSDN文章的工作,你可能需要更換string泛型類型否則,如果字符串不是什麼HttpSessionState擁有的東西。)