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

Abh*_*bhi 0 c#

我希望对这个系列进行排序 List<UserClass>

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

有效吗?

List<Function> objFunctionsList = new List<Function>(); 

// populating data in objFunctionsList 

objFunctionsList = objFunctionsList.OrderBy(x => x.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

Bob*_*ale 6

只需使用linq扩展方法orderby

var sorted=list.OrderBy(x=>x.MyProperty);
Run Code Online (Sandbox Code Playgroud)

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

var sortedList=list.OrderBy(x=>x.MyProperty).ToList();
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用此Extension类

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));
  }
}
Run Code Online (Sandbox Code Playgroud)

然后就可以了

list.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);
});
Run Code Online (Sandbox Code Playgroud)