首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >谓词和OrderBy、Func

谓词和OrderBy、Func
EN

Stack Overflow用户
提问于 2010-08-04 15:56:31
回答 4查看 11K关注 0票数 2

我知道谓词是委托给返回bool并接受泛型参数的函数的,我理解当我说:

代码语言:javascript
运行
复制
mycustomer => mycustomer.fullname == 1

它实际上意味着:

代码语言:javascript
运行
复制
delegate (Customer mycustomer)
{
  return mycustomer.fullName == "John";
}

当我传递这个lambda表达式时,我传入的参数是:

public delegate bool Criteria<T>(T value),本机称为谓词

但我不明白的是当我说mycustomer=>mycustomer.fullname是什么意思

customers.OrderBy(mycustomer=>mycustomer.fullname);

我如何实现像OrderBy这样的东西?我如何告诉一个方法要对哪个属性执行操作!就像前面的例子一样?

下面是一个例子,我想创建一个方法,用于获取特定属性的集合的所有值:

代码语言:javascript
运行
复制
list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname);

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-04 16:32:35

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

代码语言:javascript
运行
复制
var items = myList.OrderBy(i => i.SomeProperty);

OrderedEnumerable类型在内部创建一个IComparer<TKey>。在上面的示例中,如果i.SomeProperty是一个String,它将创建IComparer<String>的一个实例,然后使用SomeProperty成员上的比较器对源可枚举中的项进行排序。

在你的最后一个案例中:

代码语言:javascript
运行
复制
list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname);

您可以使用Select来完成此操作

代码语言:javascript
运行
复制
var names = customers.Select(c => c.Fullname);

它将返回String名称的枚举。在Select方法中,Func<TSource, TResult>用于选择要添加到结果中的目标元素。

要自己复制,您可以这样做:

代码语言:javascript
运行
复制
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);
  }
}
票数 3
EN

Stack Overflow用户

发布于 2010-08-04 16:33:45

您可以创建类似以下内容的内容:

代码语言:javascript
运行
复制
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方法不适合你。

票数 2
EN

Stack Overflow用户

发布于 2010-08-04 17:08:21

我不明白的是当我说

的时候它是什么意思

它与您的委托示例相同,只是它只返回fullName。作为lambda传递,以便可以对其进行惰性计算。

如果你想创建一个像OrderBy一样工作的方法,除了你的GetPropertyValues看起来和customers.Select(c => c.Fullname)是一样的,那么你必须深入研究泛型和扩展方法的海洋。OrderBy实际上只是IEnumerable上的一个扩展方法,定义如下

代码语言:javascript
运行
复制
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)

看起来@Mike的答案就是一个例子,也是LINQ Select的一个重新实现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3403615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档