2

我知道谓词是委托给返回 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

4 回答 4

3

Func<TElement,TKey>用于创建在内部IComparer<TKey>用于OrderedEnumerable对项目进行排序的 an。当你这样做时:

var items = myList.OrderBy(i => i.SomeProperty);

OrderedEnumerable类型正在IComparer<TKey>内部创建。在上面的示例中,如果i.SomeProperty是 a 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);
  }
}
于 2010-08-04T08:32:34.797 回答
2

您可以创建如下内容:

static class ExtensionClass
{
    static IEnumerable<V> GetPropertyValues<T, V>(this IList<T> collection, Func<T, V> func)
    {
        foreach(var item in collection)
        {
            yield retun func(item);
        }
    }
}

但我真的不明白为什么 Select 方法不适合你。

于 2010-08-04T08:33:45.463 回答
2

但我不明白的是当我说 mycustomer=>mycustomer.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

于 2010-08-04T09:08:20.833 回答
1

OrderBy Extension Methodon 类Enumerable接受一个类型的方法作为Func参数。是文档。

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

于 2010-08-04T08:35:30.580 回答