如何对用户创建的列表进行排序<;用户类>;C#中的集合

本文关键字:用户 lt 集合 gt 创建 列表 排序 | 更新日期: 2023-09-27 18:03:33

我希望对集合List<UserClass> 进行排序

基于用户定义的该UserClass中的各种属性中的一个属性。

有效吗

List<Function> objFunctionsList = new List<Function>(); 
// populating data in objFunctionsList 
objFunctionsList = objFunctionsList.OrderBy(x => x.Name).ToList();

如何对用户创建的列表进行排序<;用户类>;C#中的集合

只需使用linq扩展方法orderby

var sorted=list.OrderBy(x=>x.MyProperty);

如果您需要一个列表作为结果,那么添加ToList(),例如

var sortedList=list.OrderBy(x=>x.MyProperty).ToList();

或者你可以使用这个扩展类

public static class SortExtension {
  public static Comparison<T> GetComparer<T, TP>(Expression<Func<T, IComparable<TP>>> propertyExpression) {
    if (propertyExpression == null) throw new ArgumentNullException();
    var member = ((propertyExpression.Body is UnaryExpression) ? ((UnaryExpression)propertyExpression.Body).Operand : propertyExpression.Body) as MemberExpression;
    if (member == null) throw new ArgumentException();
    var parameterA = Expression.Parameter(typeof(T), "a");
    var parameterB = Expression.Parameter(typeof(T), "b");
    var nullExpr = Expression.Constant(null);
    var valueA = Expression.Property(parameterA, member.Member.Name);
    var valueB = Expression.Property(parameterB, member.Member.Name);
    var compare = Expression.Call(valueA, typeof(TP).GetMethod("CompareTo", new[] { typeof(TP) }), valueB);
    var checkBPropNull = Expression.Condition(Expression.Equal(valueB, nullExpr), Expression.Constant(0), Expression.Constant(-1));
    var checkAPropertyNull = Expression.Condition(Expression.Equal(valueA, nullExpr), checkBPropNull, compare);
    var checkBNullANot = Expression.Condition(Expression.Equal(parameterB, nullExpr), Expression.Constant(1), checkAPropertyNull);
    var checkBNullANull = Expression.Condition(Expression.Equal(parameterB, nullExpr), Expression.Constant(0), Expression.Constant(-1));
    var checkANull = Expression.Condition(Expression.Equal(parameterA, nullExpr), checkBNullANull, checkBNullANot);
    return (a, b) => Expression.Lambda<Func<T, T, int>>(checkANull, parameterA, parameterB).Compile()(a, b);
  }
  public static void SortBy<T, TP>(this List<T> source, Expression<Func<T, IComparable<TP>>> propertyExpression) {
    if (source == null) throw new ArgumentNullException();
    source.Sort(GetComparer(propertyExpression));
  }
}

然后你就可以做了

列表。SortBy(x=>x.MyProperty(;

Expression构建生成一个功能等同于的比较器

list.Sort((a,b) => {
  if (a == null) return (b==null) ? 0 :-1;
  if (b==null) return 1;
  if (a.MyProperty == null) return (b.MyProperty==null) ? 0 : -1;
  return a.T1.CompareTo(b.T1);
});
users.Sort((u1, u2) => {
    return u1.Age.CompareTo(u2.Age);
});

例如,这将按Age进行排序。

如果您的列表是列表,则:

list.Sort((a, b) => {
                       if (a==null) return (b==null) ? 0 : -1;
                       if (b==null) return 1;
                       if (a.Property==null) return (b.Property==null) ? 0 : -1;
                       return a.Property.CompareTo(b.Property);
                     });