我有一个问题,使用Linq订购这样的结构:
public class Person { public int ID { get; set; } public ListAttributes { 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);
但语法失败了.有线索吗?
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))); } }
我知道这是一个很老的帖子,但我想我会发布一个我以前发现的比较器,万一其他人需要它.
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 }
用法
ListobjectList = GetObjects(); /* from your repository or whatever */ objectList.Sort(new GenericComparer ("ObjectPropertyName", (int)SortDirection.Descending)); dropdown.DataSource = objectList; dropdown.DataBind();
您可以重载构造函数以接受SortDirection枚举.我没有这样做,因为该类在没有System.Web引用的库中.
为什么不使用键值字典而不是List
更新 - 像这样:
public class Person { public DictionaryAttributes = 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"]);