답변:
술어는 반환 함수 true
나 false
. 술어 대리자는 술어에 대한 참조입니다.
그래서 기본적 술어 대표는 함수가 반환에 대한 참조 true
또는 false
. 술어는 값 목록을 필터링하는 데 매우 유용합니다. 여기 예가 있습니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };
Predicate<int> predicate = new Predicate<int>(greaterThanTwo);
List<int> newList = list.FindAll(predicate);
}
static bool greaterThanTwo(int arg)
{
return arg > 2;
}
}
이제 C # 3을 사용하는 경우 람다를 사용하여 술어를보다 깔끔하게 표현할 수 있습니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };
List<int> newList = list.FindAll(i => i > 2);
}
}
greaterThanTwo
이 return
되지 yield return
는 때문에 FindAll
당신을 위해 순서를 처리하는 방법.
i > val
대신, i > 2
여기서, val
값이 사용자에 의해 입력된다.
c # 2 및 c # 3과 관련하여 Andrew의 대답에서 앞서서 ... 일회 검색 기능을 위해 인라인으로 수행 할 수도 있습니다 (아래 참조).
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };
List<int> newList = list.FindAll(delegate(int arg)
{
return arg> 2;
});
}
}
도움이 되었기를 바랍니다.
여기 에 술어에 대한 좋은 기사가 있지만 .NET2 시대의 기사이므로 람다 식에 대한 언급은 없습니다.
술어 위임이란 무엇입니까?
1) 술어는 true 또는 false를 반환하는 기능으로,이 개념은 .net 2.0 프레임 워크로 제공됩니다. 2) 람다 식 (=>)과 함께 사용 중입니다. 일반 유형을 인수로 사용합니다. 3) 술어 함수를 정의하고 다른 함수에 매개 변수로 전달할 수 있습니다. 4) 특별한 경우입니다 Func
. 단 하나의 매개 변수 만 가져오고 항상 bool을 반환합니다.
C # 네임 스페이스에서 :
namespace System
{
public delegate bool Predicate<in T>(T obj);
}
시스템 네임 스페이스에 정의되어 있습니다.
Predicate Delegate를 어디에서 사용해야합니까?
다음과 같은 경우 Predicate Delegate를 사용해야합니다.
1) 일반 컬렉션에서 항목을 검색합니다. 예 :
var employeeDetails = employees.Where(o=>o.employeeId == 1237).FirstOrDefault();
2) 코드를 단축하고 true 또는 false를 반환하는 기본 예 :
Predicate<int> isValueOne = x => x == 1;
이제 위의 술어를 호출하십시오.
Console.WriteLine(isValueOne.Invoke(1)); // -- returns true.
3) 익명 메소드를 다음과 같이 술어 대리자 유형에 지정할 수도 있습니다.
Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());};
bool result = isUpper("Hello Chap!!");
술어에 대한 모범 사례가 있습니까?
술어 대신 Func, Lambda Expressions 및 Delegates를 사용하십시오.
술어 기반 검색 메소드는 메소드 대리자 또는 람다 표현식이 주어진 요소가 "일치"하는지 여부를 결정할 수있게합니다. 술어는 단순히 객체를 수락하고 true 또는 false를 반환하는 델리게이트입니다. public delegate bool Predicate (T object);
static void Main()
{
string[] names = { "Lukasz", "Darek", "Milosz" };
string match1 = Array.Find(names, delegate(string name) { return name.Contains("L"); });
//or
string match2 = Array.Find(names, delegate(string name) { return name.Contains("L"); });
//or
string match3 = Array.Find(names, x => x.Contains("L"));
Console.WriteLine(match1 + " " + match2 + " " + match3); // Lukasz Lukasz Lukasz
}
static bool ContainsL(string name) { return name.Contains("L"); }
VB 9 (VS2008) 인 경우 술어는 복잡한 함수일 수 있습니다.
Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(AddressOf GreaterThanTwo)
...
Function GreaterThanTwo(ByVal item As Integer) As Boolean
'do some work'
Return item > 2
End Function
또는 표현식이 하나만있는 한 술어를 람다로 작성할 수 있습니다.
Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(Function(item) item > 2)
조건자는 C #의 일반 대리자 범주에 속합니다. 이것은 하나의 인수로 호출되며 항상 부울 유형을 반환합니다. 기본적으로 술어는 조건을 테스트하는 데 사용됩니다 (true / false). 많은 클래스가 술어를 인수로 지원합니다. 예를 들어 list.findall은 매개 변수 술어를 예상합니다. 다음은 술어의 예입니다.
서명이있는 함수 포인터를 상상해보십시오.
부울 위임 myDelegate (T match);
여기에 예가 있습니다
Node.cs
namespace PredicateExample
{
class Node
{
public string Ip_Address { get; set; }
public string Node_Name { get; set; }
public uint Node_Area { get; set; }
}
}
메인 클래스-
using System;
using System.Threading;
using System.Collections.Generic;
namespace PredicateExample
{
class Program
{
static void Main(string[] args)
{
Predicate<Node> backboneArea = Node => Node.Node_Area == 0 ;
List<Node> Nodes = new List<Node>();
Nodes.Add(new Node { Ip_Address = "1.1.1.1", Node_Area = 0, Node_Name = "Node1" });
Nodes.Add(new Node { Ip_Address = "2.2.2.2", Node_Area = 1, Node_Name = "Node2" });
Nodes.Add(new Node { Ip_Address = "3.3.3.3", Node_Area = 2, Node_Name = "Node3" });
Nodes.Add(new Node { Ip_Address = "4.4.4.4", Node_Area = 0, Node_Name = "Node4" });
Nodes.Add(new Node { Ip_Address = "5.5.5.5", Node_Area = 1, Node_Name = "Node5" });
Nodes.Add(new Node { Ip_Address = "6.6.6.6", Node_Area = 0, Node_Name = "Node6" });
Nodes.Add(new Node { Ip_Address = "7.7.7.7", Node_Area = 2, Node_Name = "Node7" });
foreach( var item in Nodes.FindAll(backboneArea))
{
Console.WriteLine("Node Name " + item.Node_Name + " Node IP Address " + item.Ip_Address);
}
Console.ReadLine();
}
}
}
단순히-> 쿼리에 주로 사용되는 조건에 따라 True / False 값을 제공합니다. 대부분 대표와 함께 사용
목록의 예를 고려하십시오
List<Program> blabla= new List<Program>();
blabla.Add(new Program("shubham", 1));
blabla.Add(new Program("google", 3));
blabla.Add(new Program("world",5));
blabla.Add(new Program("hello", 5));
blabla.Add(new Program("bye", 2));
이름과 연령을 포함합니다. 이제 조건에 따라 이름을 찾고 싶다고 가정하겠습니다.
Predicate<Program> test = delegate (Program p) { return p.age > 3; };
List<Program> matches = blabla.FindAll(test);
Action<Program> print = Console.WriteLine;
matches.ForEach(print);
단순하게 유지하려고 노력했습니다!
델리게이트는 메소드를 특정 서명으로 캡슐화하는 데 사용할 수있는 참조 유형을 정의합니다. C # 델리게이트 수명주기 : C # 델리게이트의 수명주기는 다음과 같습니다 .
자세한 내용은 http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html을 참조하십시오.
yeild return
대신 해야 합니까? 아니면 어떻게 작동합니까, 전체 목록을 어떻게 반복합니까?