代码之家  ›  专栏  ›  技术社区  ›  pierroz

C/Linq:如何在调用orderby之前为模板类一般定义keyselector

  •  1
  • pierroz  · 技术社区  · 15 年前

    我在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、tresult>keyselector对象?我对答案很感兴趣,因为在我的现实生活中,我可以有两个以上的属性。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Community CDub    8 年前
    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
  •  1
  •   Femaref    15 年前
    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();
      }
    }
    
    推荐文章