linq in plain english

时间:2011-02-02 22:45:06

标签: c# linq

有人可以用简单的英语解释这句话的语法:

以下是OrderBy运算符的签名:

OrderedSequence<TElement> OrderBy<TElement, TKey>(
    this IEnumerable<TElement> source, 
    Func<TElement, TKey> keySelector
)

这表明您需要向OrderBy提供的代理类型为Func<TElement, TKey>

我正在构建一个接收列表和字符串作为参数(列名)的函数,并且我坚持使用OrderBy扩展方法的语法。 Func<...>是什么意思?我在哪里将字符串参数与?

排序

感谢。

4 个答案:

答案 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)

此处列名是您要执行排序

的列