我知道谓词是委托给返回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);提前谢谢。
发布于 2010-08-04 16:32:35
Func<TElement,TKey>用于创建一个IComparer<TKey>,在OrderedEnumerable内部使用该sort对项目进行排序。当你这样做的时候:
var items = myList.OrderBy(i => i.SomeProperty);OrderedEnumerable类型在内部创建一个IComparer<TKey>。在上面的示例中,如果i.SomeProperty是一个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-04 16:33:45
您可以创建类似以下内容的内容:
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-04 17:08:21
我不明白的是当我说
的时候它是什么意思
它与您的委托示例相同,只是它只返回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的一个重新实现。
https://stackoverflow.com/questions/3403615
复制相似问题