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

用LINQ对类列表排序

  •  3
  • Kubi  · 技术社区  · 15 年前

    我有一个 List<MyClass> 我想按 DateTime CreateDate MyClass的属性。

    Linq有可能做到这一点吗?

    谢谢

    5 回复  |  直到 15 年前
        1
  •  4
  •   Mark Byers    15 年前

    您可以按排序顺序枚举它:

    IEnumerable<MyClass> result = list.OrderBy(element => element.CreateDate);
    

    您也可以使用 ToList() 要转换为新列表并重新分配给原始变量:

    list = list.OrderBy(element => element.CreateDate).ToList();
    

    这与对原始列表进行排序不同,因为如果仍有人引用旧列表,他们将看不到新的排序。如果您确实想对原始列表进行排序,则需要使用 List<T>.Sort 方法。

        2
  •  5
  •   Marc Gravell    15 年前

    排序 现有的 名单:

    list.Sort((x,y) => x.CreateDate.CompareTo(y.CreateDate));
    

    也可以写一个 Sort 扩展方法,允许:

    list.Sort(x => x.CreateDate);
    

    例如:

    public static class ListExt {
        public static void Sort<TSource, TValue>(
                this List<TSource> list,
                Func<TSource, TValue> selector) {
            if (list == null) throw new ArgumentNullException("list");
            if (selector == null) throw new ArgumentNullException("selector");
            var comparer = Comparer<TValue>.Default;
            list.Sort((x,y) => comparer.Compare(selector(x), selector(y)));
        }
    }
    
        3
  •  1
  •   anthonyv    15 年前

    这是一个示例:

    using System.Collections.Generic;
    using System.Linq;
    
    namespace Demo
    { 
        public class Test
        {
            public void SortTest()
            {
                var myList = new List<Item> { new Item { Name = "Test", Id = 1, CreateDate = DateTime.Now.AddYears(-1) }, new Item { Name = "Other", Id = 1, CreateDate = DateTime.Now.AddYears(-2) } };
                var result = myList.OrderBy(x => x.CreateDate);
            }
        }
    
        public class Item
        {
            public string Name { get; set; }
            public int Id { get; set; }
            public DateTime CreateDate { get; set; }
        }
    }
    
        4
  •  0
  •   Jarrett Meyer    15 年前

    当然,其他答案是 .OrderBy() 工作,但您不希望使源项继承自 IComparable 只要打电话 .Sort() ?

        5
  •  0
  •   Preet Sangha    15 年前
           class T  {
                public DateTime CreatedDate { get; set; }
            }
    

    使用:

    List<T> ts = new List<T>(); 
    ts.Add(new T { CreatedDate = DateTime.Now }); 
    ts.Add(new T { CreatedDate = DateTime.Now }); 
    ts.Sort((x,y) => DateTime.Compare(x.CreatedDate, y.CreatedDate));