어떻게 형성하는 좋은 조건자의 대리자를 찾을 수 있습니다()에서 뭔가 내 목록<T>?

StackOverflow https://stackoverflow.com/questions/242012

문제

후에 MSDN,그것은 여전히 어디에서 나는 형태로 적절한 조건자를 사용하여 찾을 수 있습니다()메소드에 목록을 사용하여 구성원의 변수 티(T 은 클래스)

예를 들어:

public class Car
{
   public string Make;
   public string Model;
   public int Year;
}

{  // somewhere in my code
   List<Car> carList = new List<Car>();
   // ... code to add Cars ...

   Car myCar = new Car();

   // Find the first of each car made between 1980 and 2000
   for (int x = 1980; x < 2000; x++)
   {
       myCar = carList.Find(byYear(x));
       Console.Writeline(myCar.Make + myCar.Model);
   }
}

무엇을 해야 하는 나의"byYear"조건자처럼 보이나요?

(MSDN 를 들어만 회담에 대한 목록의 공룡만 검색에 대한 변하지 않는 값이"saurus"-그것은 보이지 않는 값을 전달하는 방법으로 조건자...)

편집:내가 사용하여 VS2005/.NET2.0 다,그래서 나는 생각하지 않는 람다 표기할 수 있다...

EDIT2:"제거하는 1999 년에서"예시하기 때문에 나는 할 수 있습니다"찾기"프로그래밍에 따라 다른 값입니다.예 변경된 범위의 자동차는 1980 년부터 2000 을 사용한지 반복입니다.

도움이 되었습니까?

해결책

Ok,습니다.NET2.0 을 사용할 수 있는 대표,이렇게:

static Predicate<Car> ByYear(int year)
{
    return delegate(Car car)
    {
        return car.Year == year;
    };
}

static void Main(string[] args)
{
    // yeah, this bit is C# 3.0, but ignore it - it's just setting up the list.
    List<Car> list = new List<Car>
    {
        new Car { Year = 1940 },
        new Car { Year = 1965 },
        new Car { Year = 1973 },
        new Car { Year = 1999 }
    };
    var car99 = list.Find(ByYear(1999));
    var car65 = list.Find(ByYear(1965));

    Console.WriteLine(car99.Year);
    Console.WriteLine(car65.Year);
}

다른 팁

당신이 사용할 수 있는 람다 식으로 다음과 같:

myCar = carList.Find(car => car.Year == 1999);

또는 사용할 수 있는 익명의 대리인:

Car myCar = cars.Find(delegate(Car c) { return c.Year == x; });

// If not found myCar will be null
if (myCar != null)
{
     Console.Writeline(myCar.Make + myCar.Model);
}

때문에 사용할 수 없습니다 lambda 할 수 있습니다 그냥 바꾸는 익명할 수 있습니다.

myCar = carList.Find(delegate(Car car) { return car.Year == i; });

Hmm.더 많다고 생각하고 그것에 대해 사용할 수 있습니 변환을 반환하는 조건이 있습니다.

Func<int, Predicate<Car>> byYear = i => (c => c.Year == i);

지금 전달할 수 있습의 결과는 이수(는 조건자)을 당신의 방법을 찾기:

my99Car = cars.Find(byYear(1999));
my65Car = cars.Find(byYear(1965));

할 수 있습이 너무 사용:

var existData =
    cars.Find(
     c => c.Year== 1999);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top