C# 谓词和OrderBy,Func

C# 谓词和OrderBy,Func,c#,lambda,predicate,func,C#,Lambda,Predicate,Func,我知道谓词是对返回bool并接受泛型参数的函数的委托,当我说: mycustomer => mycustomer.fullname == 1 它实际上意味着: delegate (Customer mycustomer) { return mycustomer.fullName == "John"; } 传递此lambda表达式时传递的参数为: 公共委托布尔条件(T值)本机称为谓词 但我不明白的是,当我说mycustomer=>mycustomer.fullname 在custom

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

mycustomer => mycustomer.fullname == 1
它实际上意味着:

delegate (Customer mycustomer)
{
  return mycustomer.fullName == "John";
}
传递此lambda表达式时传递的参数为:

公共委托布尔条件(T值)
本机称为谓词

但我不明白的是,当我说
mycustomer=>mycustomer.fullname

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

如何实现类似于
OrderBy?如何告诉方法对哪个属性执行操作!像前面的例子一样

通过示例,我想创建一个方法,用于获取特定属性集合的所有值:

list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname);
list mylist=customers.getPropertyValue(cus=>cus.Fullname);
提前感谢。

使用
函数
创建一个
i比较程序
,该比较程序在
OrderedEnumerable
内部用于对项目进行排序。当您这样做时:

var items = myList.OrderBy(i => i.SomeProperty);
OrderedEnumerable
类型正在内部创建一个
IComparer
。在上面的示例中,如果
i.SomeProperty
字符串
,它将创建
IComparer
的实例,然后使用
SomeProperty
成员上的该压缩程序对源枚举中的项进行排序

在您的最后一个案例中:

list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname);
它将返回可枚举的
字符串
名称。在
Select
方法中,使用
Func
选择要添加到结果中的目标元素

要自己复制这一点,您可以执行以下操作:

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);
  }
}
公共静态IEnumerable GetPropertyValue
(此IEnumerable可枚举函数选择器)
{
if(可枚举==null)
抛出新ArgumentNullException(“可枚举”);
foreach(可枚举中的TSource项)
{
收益率返回选择器(项目);
}
}

您可以创建如下内容:

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);
        }
    }
}
静态类扩展类
{
静态IEnumerable GetPropertyValue(此IList集合,Func Func)
{
foreach(集合中的var项)
{
收益率回退函数(项目);
}
}
}

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

可枚举
上的
OrderBy扩展方法
使用类型为
Func
的方法作为参数。是文档

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

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

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

如果您想创建一个类似于
OrderBy
的方法,而且您的getPropertyValue似乎与
客户相同。选择(c=>c.Fullname)
,那么您就必须深入到泛型和扩展方法的海洋中
OrderBy
实际上只是定义为的
IEnumerable
上的一个扩展方法

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)
公共静态IORDerenumerable OrderBy(
这是一个数不清的来源,
Func键选择器
)

看起来@Mike的答案就是一个例子,也是LINQ
Select

的一个重新实现。非常感谢您的回复,但我知道我可以使用客户。Select(c=>c.fullname)我只是想知道如何实现这样的东西,我并不是在寻找一个属性的值,我只是举了个例子,问题是如何实现像customers.GetPropertyValues(cus=>cus.Fullname)这样的方法;或客户。选择(c=>c.Fullname);可以使用lambda表达式指定属性名称的任何方法。
谓词
是返回
bool
的函数
mycustomer=>mycustomer.fullname
是一个
Func
(我猜
fullname
string
类型)。您应该了解迭代器(IEnumerable、yield等)。如果你在使用数据库之类的东西,那就是表达式树。我并不反对select方法,问题是它不能回答问题,但你的答案可以!我接受了你的答案,非常感谢,非常好,这个答案非常好,表情树就是我要找的,谢谢。。。
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)