Programming

C #에서 술어는 무엇입니까?

procodes 2020. 6. 1. 20:46
반응형

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>(또는 Linq 또는 그 멋진 것들을 사용 하지 않고 ) 항상 다음을 수행하여이를 달성 할 수 있습니다.

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

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

괜찮지 만 "Ruth"라는 사람이 있는지 확인하고 싶습니까? 아니면 나이가 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);

주의 사항 코드 가 훨씬 적고 빠르지는 않습니다 . 개발자가 일반적으로 생각하는 것은 한 줄이 걸리면 10 줄이 걸리는 것보다 더 잘 수행해야한다는 것입니다. 그러나 뒤에서 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;

등등. 또한 a가 List<int> ints있고 첫 번째 짝수를 찾으려면 다음 과 같이하십시오.

int firstEven = ints.Find(pre);

물론 코드에서 사용할 수있는 다른 유형과 마찬가지로 변수에 설명적인 이름을 지정하는 것이 좋습니다. 위의 내용 preevenFinder또는 isEven그와 같은 줄로 바꾸는 것이 좋습니다. 그런 다음 위의 코드가 훨씬 명확합니다.

int firstEven = ints.Find(evenFinder);

술어는 정의에 따라 항상 부울을 리턴합니다.

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

술어는 프로그래밍에 매우 유용합니다. 이들은 종종 런타임에 로직을 제공하는 데 사용되며, 필요한만큼 간단하거나 복잡 할 수 있습니다.

예를 들어 WPF는 Predicate<T>ListView의 ICollectionView 필터링을위한 입력으로 사용합니다 . 이를 통해 특정 요소가 최종 뷰에 포함되어야하는지 여부를 결정하는 부울을 반환 할 수있는 논리를 작성할 수 있습니다. 논리는 매우 간단하거나 (오브젝트에서 부울을 반환) 매우 복잡 할 수 있습니다.


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

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 #에서 술어는 단순히 부울을 리턴하는 대리자입니다. 객체 모음을 검색하고 특정 항목을 원할 때 유용합니다 (제 경험상).

I've recently run into them in using 3rd party web controls (like treeviews) so when I need to find a node within a tree, I use the .Find() method and pass a predicate that will return the specific node I'm looking for. In your example, if 'a' mod 2 is 0, the delegate will return true. Granted, when I'm looking for a node in a treeview, I compare it's name, text and value properties for a match. When the delegate finds a match, it returns the specific node I was looking for.

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

반응형