我知道谓词是返回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.SomePropertyString,它将创建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);
  }
}

10-04 11:00