【问题标题】:C#/LINQ: How to define generically a keySelector for a templated class before calling OrderByC#/LINQ:如何在调用 OrderBy 之前为模板类定义一个 keySelector
【发布时间】:2010-06-08 10:09:00
【问题描述】:

我在 C# 中定义了以下类

class myClass<T,U>
{
    public T PropertyOne { get; set; }
    public U PropertyTwo { get; set; }
}

我需要编写一个函数,对 myClass 对象列表进行重新排序,并采用其他两个参数来定义我如何进行重新排序:我的重新排序是否依赖于 PropertyOne 或 PropertyTwo,它是升序还是降序。假设这两个参数是布尔值。以我目前在 LINQ 方面的知识,我会写:

public IList<myClass<T,U>> ReOrder(IList<myClass<T,U>> myList, bool usePropertyOne, bool ascending)
{
    if (usePropertyOne)
    {
        if (ascending)
        {
            return myList.OrderBy(o => o.PropertyOne).ToList();
        }
        else
        {
            return myList.OrderByDescending(o => o.PropertyOne).ToList();
        }
    }
    else
    {
        if (ascending)
        {
            return myList.OrderBy(o => o.PropertyTwo).ToList();
        }
        else
        {
            return myList.OrderByDescending(o => o.PropertyTwo).ToList();
        }
    }
}

有什么更有效/更优雅的方式来做到这一点?当我调用 OrderBy 或 OrderByDescending 时,如何声明要重用的 Func&lt;myClass&lt;U,V&gt;,TResult&gt; keySelector 对象?我对答案很感兴趣,因为在我的现实生活中,我可以拥有两个以上的属性。

【问题讨论】:

    标签: c# linq sql-order-by


    【解决方案1】:
    public IList<T> ReOrder<T, U>(
      IList<T> myList,
      Func<T, U> keySelector,
      bool ascending) 
    { 
      Func<IEnumerable<T>, IEnumerable<T>> orderingFunc =
        ascending ?
        x => x.OrderBy(keySelector) :
        x => x.OrderByDescending(keySelector);
    
      return orderingFunc(myList).ToList();
    }
    

    如果您只想将其限制为 MyClass,您可以使用以下签名:

    public IList<T> ReOrder<T, U, V>(
      IList<myClass<T, U>> myList,
      Func<myClass<T, U>, V> keySelector,
      bool ascending) 
    

    如果您的问题是您有一个 bool 并且想要一个 keySelector,但不能有一个 keySelector 变量,因为它可能必须返回 T 和 U 类型,那么请查看此答案:Generic Linq ordering function?

    【讨论】:

    • 您的回答和链接我已经得到了我正在寻找的所有信息。非常感谢!
    【解决方案2】:
    public IList<myClass<T,U>> ReOrder(IList<myClass<T,U>> myList, Func<myClass<T,U>, object> selector, bool ascending)
    {
      if (ascending)
      {
        return myList.OrderBy(selector).ToList();
      }
      else
      {
        return myList.OrderByDescending(selector).ToList();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      相关资源
      最近更新 更多