谓词和OrderBy,Func

时间:2010-08-04 07:56:31

标签: c# lambda predicate func

我理解谓词是委托函数返回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);

提前致谢。

4 个答案:

答案 0 :(得分:3)

Func<TElement,TKey>用于创建IComparer<TKey>OrderedEnumerablevar items = myList.OrderBy(i => i.SomeProperty); 内部用于对项目进行排序。当你这样做时:

OrderedEnumerable

IComparer<TKey>类型正在内部创建i.SomeProperty。在上面的示例中,如果StringIComparer<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)

OrderBy Extension Method上的Enumerable采用类型为Func的方法作为参数。 Here是文档。

Here是您可以使用的另一篇好文章。

答案 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的重新实现。