我知道谓词是返回bool并采用通用参数的函数的委托,我明白当我说:
mycustomer => mycustomer.fullname == 1
它实际上意味着:
delegate (Customer mycustomer)
{
return mycustomer.fullName == "John";
}
当我传递此lambda表达式时,传递的参数是:
public delegate bool Criteria<T>(T value)
本身称为谓词但是我不明白的是,当我说
mycustomer=>mycustomer.fullname
在
customers.OrderBy(mycustomer=>mycustomer.fullname);
中如何实现类似
OrderBy
的内容?如何告诉方法要对哪个属性执行操作!像前面的例子一样?举个例子,在这种情况下,我想创建一个方法来获取特定属性的集合的所有值:
list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname);
提前致谢。
最佳答案
Func<TElement,TKey>
用于创建IComparer<TKey>
,该内部在OrderedEnumerable
中用于对项目进行排序。当您这样做时:
var items = myList.OrderBy(i => i.SomeProperty);
OrderedEnumerable
类型正在内部创建IComparer<TKey>
。在上面的示例中,如果i.SomeProperty
是String
,它将创建IComparer<String>
的实例,然后使用SomeProperty
成员上的该编译器对可枚举的源中的项目进行排序。最后一种情况:
list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname);
您可以使用
Select
执行此操作:var names = customers.Select(c => c.Fullname);
它将返回一个可枚举的
String
名称。在Select
方法中,Func<TSource, TResult>
用于选择要添加到结果中的目标元素。要自己复制此代码,您可以执行以下操作:
public static IEnumerable<TMember> GetPropertyValues<TSource, TMember>
(this IEnumerable<TSource> enumerable, Func<TSource, TMember> selector)
{
if (enumerable == null)
throw new ArgumentNullException("enumerable");
foreach (TSource item in enumerable)
{
yield return selector(item);
}
}