2014-11-20 5 views
0

HttpSession 컬렉션에서 항목을 제거해야합니다. 다음 코드에서 myList는 Session과 동일한 항목을 포함합니다. myList/Session에 itemsToRemove에없는 항목이 있으면 세션 모음에서 삭제해야합니다.List.ForEach()에서 조건을 사용하는 방법?

그러나 람다 구문이 어떤 모양인지 잘 모르겠습니다. 다음은 올바르지 않습니다.

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

모든 아이디어를이 작업을 수행하는 데 한 줄에 모든 것을 넣을 수있는 람다 식을 사용할 수 있습니까?

또한 중간 목록 (myList)을 만드는 것을 피할 수있는 방법이 있습니까? 나는 세션을 반복하면서 아이템을 제거 할 수 없기 때문에 그렇게하고있다.

답변

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()를 호출해야합니다. 무엇이 전체 컬렉션의 1 초과 초과 열거를 유발합니까?

내가 대신 이런 짓을 했을까 :

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

이 열거의 수를 최소화 할 수 있습니다.

+0

어디서 나옵니까? 나는 목록 을 사용하고 있으며 그것을 보지 못한다. – 4thSpace

+0

@ 4thSpace : 'using System.Linq;'를 추가하십시오. – abatishchev

+0

굉장! 감사. – 4thSpace

0

첫째로, abatischev의 대답은 우수합니다. 성능 관점과 가독성 측면 모두에서 이상적입니다. 당신에게 metnioned abatischev으로

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

ToList() 전화 비용 추가를 : 그러나, 당신은 정말 (나는 권장하지 않는) 하나 개의 문장으로 모든 기능을 벼락 공부하려면, 다음을 시도 할 수있는 경우 컬렉션에 많은 수의 요소가있는 경우 성능에 심각한 영향을 줄 수있는 컬렉션을 통한 열거. 그러나 새로 작성한 List<string>을 통해 ForEach()을 반복하여 호출하여 myList 역할을 수행하고 Session에서 항목을 제거 할 수 있습니다 (Session이 아닌 해당 임시 목록을 반복하므로).

(내가 HttpSessionState은 단지 자신의 MSDN 문서를 쳐다 보면서, 나 자신을 객체와 함께 일하지 않습니다. 당신은 문자열 HttpSessionState가 어떨지하지 않으면 뭔가 다른과 string 제네릭 형식을 교체해야 할 수도 있습니다.)