在C#中使用谓词代表
你能向我解释一下吗?
- 什么是谓语代表?
- 我们应该在哪里使用谓词?
- 任何使用谓词的最佳实践?
描述性的源代码将不胜感激,
感谢所有答复!
谓词是一个返回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,则可以使用lambda表示清晰的谓词:
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); } }
从Andrew关于c#2和c#3的回答开始,你也可以为它们内联一个search函数(见下面)。
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; }); } }
希望这可以帮助。
只是一个返回布尔值的委托。 它用于过滤列表很多,但可以在任何你想要的地方使用。
List<DateRangeClass> myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate); myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):
这里有一个关于谓词的好文章,虽然它是从.NET2时代开始的,所以在那里没有提到lambdaexpression式。
基于谓词的search方法允许方法委托或lambdaexpression式决定给定元素是否为“匹配”。谓词仅仅是接受对象并返回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
或者你可以把你的谓词写成一个lambdaexpression式,只要它是一个expression式即可:
Dim list As New List(Of Integer)(New Integer() {1, 2, 3}) Dim newList = list.FindAll(Function(item) item > 2)
什么是谓词代表?
1)Predicate是一个返回true或false的特性。这个概念已经进入.net 2.0框架。 2)正在使用lambdaexpression式(=>)。 它将generics作为参数。 3)它允许一个谓词函数被定义并作为parameter passing给另一个函数。 4)这是一个Func
的特殊情况,它只需要一个参数,总是返回一个布尔值。
在C#命名空间中:
namespace System { public delegate bool Predicate<in T>(T obj); }
它在System命名空间中定义。
我们应该在哪里使用Predicate Delegate?
在下列情况下,我们应该使用谓词代表:
1)用于search通用集合中的项目。 例如
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委托types,如下所示:
Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());}; bool result = isUpper("Hello Chap!!");
任何有关谓词的最佳实践?
使用Func,Lambdaexpression式和代表而不是Predicates。
一个委托定义了一个引用types,可以用来封装具有特定签名的方法。 C#委托生命周期:C#委托的生命周期是
- 宣言
- 实例化
- 度假中
了解更多formshttp://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html