C# 谓词和OrderBy,Func
我知道谓词是对返回bool并接受泛型参数的函数的委托,当我说: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
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
)