当前位置:  开发笔记 > 编程语言 > 正文

使用查询表达式对List <T>进行排序

如何解决《使用查询表达式对List<T>进行排序》经验,为你挑选了3个好方法。

我有一个问题,使用Linq订购这样的结构:

public class Person
{
    public int ID { get; set; }
    public List Attributes { get; set; }
}

public class PersonAttribute
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

一个人可能会这样:

PersonAttribute Age = new PersonAttribute { ID = 8, Name = "Age", Value = "32" };
PersonAttribute FirstName = new PersonAttribute { ID = 9, Name = "FirstName", Value = "Rebecca" };
PersonAttribute LastName = new PersonAttribute { ID = 10, Name = "LastName", Value = "Johnson" };
PersonAttribute Gender = new PersonAttribute { ID = 11, Name = "Gender", Value = "Female" };

我想使用LINQ投影来对按我选择的person属性提升的人员列表进行排序,例如,对Age进行排序,或者对FirstName进行排序.

我正在尝试类似的东西

string mySortAttribute = "Age"
PersonList.OrderBy(p => p.PersonAttribute.Find(s => s.Name == mySortAttribute).Value);

但语法失败了.有线索吗?



1> Marc Gravell..:

OrderBy是一个产生新序列的LINQ扩展.要订购现有序列,您需要添加一个或两个扩展方法...然后您可以使用:

PersonList.Sort(p => p.Attributes.Find(
  s => s.Name == mySortAttribute).Value);

public static class ListExtensions {
  public static void Sort(
    this List source,
    Func selector)
  {
    var comparer = Comparer.Default;
    source.Sort((x, y) => comparer.Compare(selector(x), selector(y)));
  }
  public  static void SortDescending(
    this List source,
    Func selector)
  {
    var comparer = Comparer.Default;
    source.Sort((x, y) => comparer.Compare(selector(y), selector(x)));
  }
}



2> Jim Schubert..:

我知道这是一个很老的帖子,但我想我会发布一个我以前发现的比较器,万一其他人需要它.

public class GenericComparer : IComparer
 {
     public string SortExpression { get; set; }
     public int SortDirection { get; set; } // 0:Ascending, 1:Descending

     public GenericComparer(string sortExpression, int sortDirection)
     {
         this.SortExpression = sortExpression;
         this.SortDirection = sortDirection;
     }
     public GenericComparer() { }

     #region IComparer Members
     public int Compare(T x, T y)
     {
         PropertyInfo propertyInfo = typeof(T).GetProperty(SortExpression);
         IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
         IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);

         if (SortDirection == 0)
         {
             return obj1.CompareTo(obj2);
         }
         else return obj2.CompareTo(obj1);
     }
     #endregion
 }

用法

List objectList = GetObjects(); /* from your repository or whatever */
objectList.Sort(new GenericComparer("ObjectPropertyName", (int)SortDirection.Descending));
dropdown.DataSource = objectList;
dropdown.DataBind();

您可以重载构造函数以接受SortDirection枚举.我没有这样做,因为该类在没有System.Web引用的库中.



3> Chris..:

为什么不使用键值字典而不是List ?我认为它会更适合,并使其他一切变得更容易.

更新 - 像这样:

public class Person
{
  public Dictionary Attributes = new Dictionary();
}

List people = new List();

Person rebecca = new Person();
rebecca.Attributes["Age"] = "32";
rebecca.Attributes["FirstName"] = "Rebecca";
rebecca.Attributes["LastName"] = "Johnson";
rebecca.Attributes["Gender"] = "Female";
people.Add(rebecca);

var PeopleInAgeOrder = people.OrderBy(p => p.Attributes["Age"]);


这不回答他的问题.他没有问如何重组他的数据,他问如何对一个(可能是现有的,可能是不可更改的遗留)数据结构进行排序.
推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有