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

C# 如何在C中对用户创建的列表集合进行排序,c#,C#,我想整理一下收集清单 基于用户定义的UserClass中的一个属性 有效吗 List<Function> objFunctionsList = new List<Function>(); // populating data in objFunctionsList objFunctionsList = objFunctionsList.OrderBy(x => x.Name).ToList(); 只需使用linq扩展方法orderby var sorted

我想整理一下收集清单

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

有效吗

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

// populating data in objFunctionsList 

objFunctionsList = objFunctionsList.OrderBy(x => x.Name).ToList();

只需使用linq扩展方法orderby

var sorted=list.OrderBy(x=>x.MyProperty);
如果您需要一个列表作为结果,那么添加ToList eg

或者,您可以使用这个扩展类

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));
  }
}

例如,这将按年龄排序。

如果您的列表是list,则:

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);
                     });

我可以用LINQ对它进行排序吗,尽管我可能可以用Comparer对它进行排序。这段代码是否会产生强制转换问题,我注意到排序后我们实际上创建了一个副本,我们不能对实际列表进行排序吗?所以为了实现这一点,我想我应该使用这个objFunctionsList.Sorta,b=>a.Name.CompareTob.Name;此代码不会创建强制转换问题,因为它使用泛型来保持类型安全。如果.Name为null,sort函数将引发异常,而linq不会。您需要确定复制列表的问题有多大。另外,您是如何填充列表的,您可以在填充例程中使用linq从一开始就有效地跳过副本。正确,但为什么要在他想要对现有列表排序时创建新列表?是的,这是有效的,它不起作用吗?你有没有参考过这个系统。Linqa还有另一个很棒而且简洁的语法
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);
});
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);
                     });