문제
내가 사용하는 C#.
그래서 나는 개체는 일부 분야에,진짜로 중요하지 않다.나는 일반적 목록 이러한 객체입니다.
List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);
그래서 내가 원하는 개체를 제거하기 위해서는 내 목록 몇 가지 기준에 따라.예를 들어, myObject.X >= 10.
내가 사용하고 싶 RemoveAll(Predicate<T> match)
기 위한 방법이다.
내가 알고 있을 정의 대리자로 전달할 수 있 RemoveAll,그러나 알고 싶을 정의하는 방법 이 인라인 익명의 대리자를 만드는 대신 무리의 대리인 기능만 사용 한다.
해결책
두 개의 옵션은 명시적 또는 위임 대리인으로 변장 lamba 구성:
명시적인 대리인
myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; });
람다
myObjects.RemoveAll(m => m.X >= 10);
또한:
성능 wise 모두가 동일합니다.사실의 문제로,모두어 구조를 생성하는 동 IL 경우 컴파일합니다.이 때문에 C#3.0 은 기본적으로 확장에서는 C#2.0,그래서 그것을 컴파일하는 C#2.0 의 구성:)
다른 팁
Lambda C#3.0 방법:
myObjects.RemoveAll(m => m.x >= 10);
익명의 위임 C#2.0 방법:
myObjects.RemoveAll(delegate (MyObject m) {
return m.x >= 10;
});
그리고,VB,사람을 VB9.0lambda 방법:
myObjects.RemoveAll(Function(m) m.x >= 10)
불행하게도,VB 지원하지 않는 익명할 수 있습니다.
//C# 2.0
RemoveAll(delegate(Foo o){ return o.X >= 10; });
나
//C# 3.0
RemoveAll(o => o.X >= 10);
나
Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; });
//or Predicate<Foo> matches = o => o.X >= 10;
RemoveAll(matches);
조건자는 위임하는 param 고 반환합니다.
우리가 할 수 있는 동에는 다음과 같은 방법
1) 를 사용하여 람다 식 인라인
RemoveAll(p=> p.x > 2);
2) 익명을 사용하여 기능
RemoveAll(delegate(myObject obj){
return obj.x >=10;
})
3) 사용 조건자 대리인
Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid);
RemoveAll(matches);
Predicate<Foo> matches = delegate(Foo o){ return o.X >= 20; });
RemoveAll(matches);
3) 선언을 위임 explicitily 과를 가리키는 기능
public delegate bool IsInValidEmployee (Employee emp);
IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);
//실제 기능
public static bool IsEmployeeInValid(Employee emp)
{
if (emp.Id > 0 )
return true;
else
return false;
}
제휴하지 않습니다 StackOverflow