C# 如何在C中对用户创建的列表集合进行排序
我想整理一下收集清单 基于用户定义的UserClass中的一个属性 有效吗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
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);
});