Deseo ordenar la colección List
sobre la base de una de las propiedades entre varios de esa clase de usuario que es definida por el usuario.
Es valido
List objFunctionsList = new List(); // populating data in objFunctionsList objFunctionsList = objFunctionsList.OrderBy(x => x.Name).ToList();
Si su lista es lista, entonces:
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); });
Solo usa el método de extensión linq orderby
var sorted=list.OrderBy(x=>x.MyProperty);
Si necesita una lista como resultado, agregue ToList()
por ejemplo,
var sortedList=list.OrderBy(x=>x.MyProperty).ToList();
Alternativamente, podrías usar esta clase de Extensión
public static class SortExtension { public static Comparison GetComparer(Expression>> 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>(checkANull, parameterA, parameterB).Compile()(a, b); } public static void SortBy(this List source, Expression>> propertyExpression) { if (source == null) throw new ArgumentNullException(); source.Sort(GetComparer(propertyExpression)); } }
Entonces puedes simplemente hacer
list.SortBy (x => x.MyProperty);
El edificio de Expresión produce un comparador que es funcionalmente equivalente a
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); });
Esto ordenará por Age
por ejemplo.