source

c#에서 술어란 무엇입니까?

itover 2023. 4. 27. 22:13
반응형

c#에서 술어란 무엇입니까?

저는 술어를 사용하는 것에 매우 익숙치 않고 쓰는 법을 막 배웠습니다.

Predicate<int> pre = delegate(int a){ a %2 == 0 };

서술어는 무엇을 반환하고 프로그래밍할 때 어떻게 유용합니까?

Predicate<T>어떤 것이 주어진 것에 대해 진실인지 기본적으로 테스트하는 편리한 방법을 제공하는 기능적 구성입니다.T물건.

예를 들어 수업이 있다고 가정합니다.

class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

이제 제가 가지고 있다고 가정해 보겠습니다.List<Person> people명단에 오스카라는 사람이 있는지도 알고 싶습니다

를 사용하지 않고Predicate<Person>( 린크, 그 중 것이든) 저는 과 같은 을 함으로써 을 달성할 수

Person oscar = null;
foreach (Person person in people) {
    if (person.Name == "Oscar") {
        oscar = person;
        break;
    }
}

if (oscar != null) {
    // Oscar exists!
}

이것은 괜찮지만, 그럼 "루스"라는 사람이 있는지 확인하고 싶다고 합시다.아니면 17살의 사람?

사용Predicate<Person>훨씬 적은 코드를 사용하여 다음을 찾을 수 있습니다.

Predicate<Person> oscarFinder = (Person p) => { return p.Name == "Oscar"; };
Predicate<Person> ruthFinder = (Person p) => { return p.Name == "Ruth"; };
Predicate<Person> seventeenYearOldFinder = (Person p) => { return p.Age == 17; };

Person oscar = people.Find(oscarFinder);
Person ruth = people.Find(ruthFinder);
Person seventeenYearOld = people.Find(seventeenYearOldFinder);

제가 코드를 훨씬 적게 말했습니다. 속도가 많이 빠르지 않습니다.개발자들이 일반적으로 오해하는 것은 어떤 것이 한 줄을 차지한다면, 그것은 열 줄을 차지하는 것보다 더 잘 수행되어야 한다는 것입니다.하지만 뒤에서 보면,Find, 소는을 취하는 Predicate<T>결국 열거하는 것뿐입니다.많은 Linq의 기능도 마찬가지입니다.

이제 질문에 포함된 특정 코드를 살펴보겠습니다.

Predicate<int> pre = delegate(int a){ return a % 2 == 0; };

에 여기있습다니가 있습니다.Predicate<int> pre그것은 필요합니다.int a 와리즈턴을 반환합니다.a % 2 == 0이것은 본질적으로 짝수를 테스트하는 것입니다.그 의미는 다음과 같습니다.

pre(1) == false;
pre(2) == true;

등등.이것은 또한 만약 당신이 가지고 있다면,List<int> ints은 첫 번째 짝수를 때 하면 .

int firstEven = ints.Find(pre);

코드에 할 수 이름을 . 의 변수를 하는 것이 . 따라서 위의 내용을 변경하는 것이 좋습니다.pre와 비슷한 정도로evenFinder또는isEven그 노선들을 따라 뭔가.그러면 위의 코드가 훨씬 명확해집니다.

int firstEven = ints.Find(evenFinder);

술어는 정의상 항상 부울을 반환합니다.

Predicate<T> 기본적으로 와 동일합니다.Func<T,bool>.

술어는 프로그래밍에 매우 유용합니다.런타임에 논리를 제공하는 데 사용되는 경우가 많으며 필요에 따라 단순하거나 복잡할 수 있습니다.

들어 는 " " ", WPF " 를 합니다.Predicate<T>ListView의 I CollectionView 필터링을 위한 입력으로 사용됩니다.이를 통해 특정 요소를 최종 뷰에 포함할지 여부를 결정하는 부울을 반환할 수 있는 논리를 작성할 수 있습니다.논리는 매우 단순할 수도 있고(개체에 대한 부울 값을 반환할 수도 있음) 매우 복잡할 수도 있습니다.

다음 코드는 술어(지정된 반복자와 결합)의 실제 사용을 이해하는 데 도움이 될 수 있습니다.

namespace Predicate
{
    class Person
    {
        public int Age { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            foreach (Person person in OlderThan(18))
            {
                Console.WriteLine(person.Age);
            }
        }

        static IEnumerable<Person> OlderThan(int age)
        {
            Predicate<Person> isOld = x => x.Age > age;
            Person[] persons = { new Person { Age = 10 }, new Person { Age = 20 }, new Person { Age = 19 } };

            foreach (Person person in persons)
                if (isOld(person)) yield return person;
        }
    }
}

C#에서 술어는 단순히 부울을 반환하는 대리인입니다.개체 모음을 검색하고 특정 항목을 원할 때 유용합니다(내 경험에 따르면).

최근에 타사 웹 컨트롤(예: 트리 보기)을 사용하는 과정에서 이러한 기능을 사용했기 때문에 트리에서 노드를 찾아야 할 때 를 사용합니다.() 메서드를 찾고 내가 찾고 있는 특정 노드를 반환하는 술어를 전달합니다.이 예제에서 'a' 모드 2가 0이면 대리자가 true를 반환합니다.트리 뷰에서 노드를 찾을 때 이름, 텍스트 및 값 속성을 비교하여 일치시킵니다.대리자가 일치하는 항목을 찾으면 원하는 특정 노드를 반환합니다.

언급URL : https://stackoverflow.com/questions/1710301/what-is-a-predicate-in-c

반응형