【问题标题】:C# Is it possible to abstract an orderby LINQ clause into a function parameter?C# 是否可以将 orderby LINQ 子句抽象为函数参数?
【发布时间】:2011-06-06 07:19:59
【问题描述】:

我有一个绑定到 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 降序”部分作为函数参数传递?

或者有没有更简单的方法来达到预期的效果?

【问题讨论】:

    标签: c# linq sql-order-by function-parameter


    【解决方案1】:

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

    如果您想通过 ID 对每个类型进行排序,您也可以在所有这些类型上指定一个接口并使用泛型方法。

    例如

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

    可以这样称呼

    Sort(list.OrderByDescending(x =&gt; x.ID));

    您的 ObservableCollection 在哪个列表中。

    【讨论】:

    • 这是一个很好的答案,但绝对需要一个代码示例
    【解决方案2】:

    您可以像这样定义一个排序函数

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

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

    然后您可以将此排序功能应用于任何IEnumerable&lt;Tag&gt;

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

    【讨论】:

    • 啊,Func 中的 int 让我绊倒了……我试图将集合类型放在那里,例如as Func> (这根本没有任何意义)所以第一个arg是集合中类的类型,第二个是返回类型该类中的属性(这更有意义)感谢关于否定结果的提示以模拟降序
    【解决方案3】:

    我设法实现这一点的方法是使用 thekip 将 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;
    }
    

    【讨论】:

      【解决方案4】:

      我认为您正在寻找 Dynamic Linq。

      看看这些示例是否有帮助:-

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

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

      【讨论】:

        【解决方案5】:

        您可以为此使用Dynamic Linq

        你可以这样写:

        var sortExpr = "x.ID";

        IQueryable&lt;Tag&gt; sortedQuery = query.OrderBy(sortExpr);

        【讨论】:

          【解决方案6】:

          您可以使用 Dynamic Query。它将在运行时动态、动态地编写 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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-10-18
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            • 2011-04-30
            • 2020-09-16
            • 2012-03-08
            相关资源
            最近更新 更多