문제

내가 사용하는 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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top