我理解谓词是委托函数返回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);
提前致谢。
答案 0 :(得分:3)
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);
}
}
用于选择要添加到结果中的目标元素。
要自己复制,你可以这样做:
{{1}}
答案 1 :(得分:3)
您可以创建以下内容:
static class ExtenstinonClass
{
static IEnumerable<V> GetPropertyValues<T, V>(this IList<T> collection, Func<T, V> func)
{
foreach(var item in collection)
{
yield retun func(item);
}
}
}
但我真的不明白为什么Select方法不适合你。
答案 2 :(得分:2)
答案 3 :(得分:2)
但我不明白的是当我说mycustomer =&gt; mycustomer.fullname
时它意味着什么
它与您的委托示例相同,只是它只返回fullName。作为lambda传递,以便它可以进行惰性评估。
如果你想创建一个类似于OrderBy
的方法,除了你的GetPropertyValues看起来与customers.Select(c => c.Fullname)
相同之外,那么你将不得不深入了解泛型和扩展方法的海洋。 OrderBy
实际上只是IEnumerable
上定义为
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
)
看起来@Mike的答案就是一个例子,也是LINQ Select
的重新实现。