有人可以用简单的英语解释这句话的语法:
以下是OrderBy
运算符的签名:
OrderedSequence<TElement> OrderBy<TElement, TKey>( this IEnumerable<TElement> source, Func<TElement, TKey> keySelector )
这表明您需要向OrderBy
提供的代理类型为Func<TElement, TKey>
。
我正在构建一个接收列表和字符串作为参数(列名)的函数,并且我坚持使用OrderBy
扩展方法的语法。 Func<...>
是什么意思?我在哪里将字符串参数与?
感谢。
答案 0 :(得分:2)
好吧,这个人是一个扩展方法(来自于此),它可以在一些IEnumerable(TElement)上运行。它需要一种方法,当给定列表中的元素时,返回可以排序的内容。
来自:http://msdn.microsoft.com/en-us/library/bb534966.aspx
class Pet
{
public string Name { get; set; }
public int Age { get; set; }
}
public static void OrderByEx1()
{
Pet[] pets = { new Pet { Name="Barley", Age=8 },
new Pet { Name="Boots", Age=4 },
new Pet { Name="Whiskers", Age=1 } };
IEnumerable<Pet> query = pets.OrderBy(pet => pet.Age);
foreach (Pet pet in query)
{
Console.WriteLine("{0} - {1}", pet.Name, pet.Age);
}
}
/*
This code produces the following output:
Whiskers - 1
Boots - 4
Barley - 8
*/
答案 1 :(得分:2)
给出
,您可以在实践中看到它List<MyClass> list;
和
public class MyClass
{
public string Name { get; set; }
// ...
}
你可能会说
list.OrderBy(x => x.Name);
this IEnumerable<TElement> source
就是我们如何知道我们将其称为任何IEnumerable的扩展方法。
如果您使用的是动态属性名称,那么您将不得不变得更加花哨。我首先定义一个辅助函数,以确保我们的lambda不会太乱。请注意,为了说明概念的时间和清晰度,我省略了诸如检查和错误处理之类的事情:
public object GetPropertyByName(object obj, string propertyName)
{
object result = null;
var prop = obj.GetType().GetProperty(propertyName);
result = prop.GetValue(obj, null);
return result;
}
现在使用我们的助手:
List<MyClass> list = new List<MyClass>();
list.Add(new MyClass { Name = "John" });
list.Add(new MyClass { Name = "David" });
list.Add(new MyClass { Name = "Adam" });
list.Add(new MyClass { Name = "Barry" });
const string desiredProperty = "Name"; // You can pass this in
var result = list.OrderBy(x => GetPropertyByName(x, desiredProperty));
foreach (MyClass c in result)
{
Console.WriteLine(c.Name);
}
答案 2 :(得分:1)
Func<TElement, TKey>
是指一个函数,它接受类型TElement
的参数并返回类型TKey
的值。您可以在调用函数时指定类型(例如foo.OrderBy<MyObject, string>(...)
),但编译器通常可以从提供的函数中推断它们。
现在,OrderBy
不对列名进行排序,它采用一个函数将对象作为参数进行检查并返回值以进行排序。例如,
list.OrderBy(item => item.SortByField)
当然,除了lambda语法之外,还可以使用其他东西来定义函数(例如,作为常规方法),但这通常是最方便的。
为了按运行时定义的属性名进行排序,您必须想出一种方法来创建一个从指定属性中提取值的函数。一种方法是使用反射,另一种方法是使用Expression
类动态构造lambda表达式,然后将其编译为Func
。
这是一个例子(完全未经测试 - 但沿着这些方向的东西)
using System.ComponentModel;
public static IEnumerable<TValue> OrderByField<TValue>(this IEnumerable<TValue> source, string fieldName) {
PropertyDescriptor desc = TypeDescriptor.GetProperties(typeof(TValue))[fieldName];
return source.OrderBy(item => desc.GetValue(item));
}
答案 3 :(得分:1)
你可以使用
(from o in listOfObjects
select o).OrderBy(p => p.columnname)
此处列名是您要执行排序
的列