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);
물론 코드에서 사용할 수있는 다른 유형과 마찬가지로 변수에 설명적인 이름을 지정하는 것이 좋습니다. 위의 내용 pre
을 evenFinder
또는 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
'Programming' 카테고리의 다른 글
명령 줄에서 Windows EventLog 소스를 만드는 방법은 무엇입니까? (0) | 2020.06.01 |
---|---|
Java에서 배열 정렬 (0) | 2020.06.01 |
친숙한 XML 문자열을 인쇄하도록 XML 문자열 형식화 (0) | 2020.06.01 |
INSTALL_FAILED_TEST_ONLY로 ADB 설치가 실패 함 (0) | 2020.06.01 |
문자열과 바이트 문자열의 차이점은 무엇입니까? (0) | 2020.06.01 |