C#是否可以将orderby LINQ子句抽象为函数参数

本文关键字:抽象 子句 函数 参数 LINQ orderby 是否 | 更新日期: 2023-09-27 17:58:30

我有一个绑定到WPF列表视图的ObservableCollection。我希望能够通过单击列标题来对ListView控件的列进行排序。为此,我对ObservableCollection进行排序,并让绑定负责更新GUI。

为了对ObservableCollection进行排序,我使用以下代码:

sortedData = new ObservableCollection<Tag>( from x in data
                                            orderby x.ID descending
                                            select x );
data = sortedData;

注意:数据绑定到ListView

我遇到的问题是,对于每一列,都会有大量的复制粘贴代码来达到所需的效果。是否可以将LINQ语句的"orderby x.ID descending"部分作为函数参数传递?

还是有一种更简单的方法可以达到预期的结果?

C#是否可以将orderby LINQ子句抽象为函数参数

您可以使用Func作为包含lambda表达式的方法参数。

如果你想按每个类型的ID排序,你也可以在所有这些类型上指定一个接口,并使用一个通用方法。

例如

public ObservableCollection<Tag> Sort(Func<ObservableCollection<Tag>> sortFunc)  
{  
    //do something else  
    data = sortFunc();  
    //do something else  
}

可以称之为

Sort(list.OrderByDescending(x => x.ID));

哪个列表是您的ObservableCollection。

您定义了一个排序函数,如下所示:

Func<Tag, int> sortFunc = x => -x.ID;

(按负ID排序的效果与按ID降序排序的效果相同。)

然后,您可以将此排序函数应用于任何IEnumerable<Tag>:

var sortedData = new ObservableCollection<Tag>(data.OrderBy(sortFunc));

我设法实现这一点的方法是用kip的想法将Func传递到函数中,例如

sortColumn( "ID", x => x.ID );
protected void sortColumn<T>( string name, Func<Tag, T> selector )
{
    ObservableCollection<Tag> sortedData = new ObservableCollection<Tag>( TagData.OrderBy( selector ) );
    data = sortedData;
}

我认为您正在寻找Dynamic Linq。

看看这些样本是否有帮助:-

http://msdn.microsoft.com/en-gb/bb737920.aspx

http://msdn.microsoft.com/en-gb/bb737920.aspx

您可以将Dynamic Linq用于此

在那里你可以写这样的东西:

var sortExpr = "x.ID";

IQueryable<Tag> sortedQuery = query.OrderBy(sortExpr);

您可以使用动态查询。它将在运行时动态地组成LINQ语句。

例如:

var query =
           db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
           OrderBy("CompanyName").
           Select("New(CompanyName as Name, Phone)");

您可以在此处获取:http://code.msdn.microsoft.com/DynamicQuery-f65f6a4d