Si está utilizando LINQ-to-objects y no quiere Para tomar una dependencia de una biblioteca externa, no es difícil lograr lo que desea.
La cláusula OrderBy()
acepta un Func<TSource, TKey>
que obtiene una clave de clasificación de un elemento de origen. Se puede definir la función fuera de la OrderBy()
cláusula:
Func<Item, Object> orderByFunc = null;
A continuación, puede asignar a diferentes valores en función de los criterios de clasificación:
if (sortOrder == SortOrder.SortByName)
orderByFunc = item => item.Name;
else if (sortOrder == SortOrder.SortByRank)
orderByFunc = item => item.Rank;
A continuación, se puede ordenar:
var sortedItems = items.OrderBy(orderByFunc);
Este ejemplo asume que el tipo de fuente es Item
que tiene las propiedades Name
y Rank
.
Tenga en cuenta que en este ejemplo TKey
es Object
para no restringir los tipos de propiedades que se pueden ordenar. Si el func devuelve un tipo de valor (como Int32
), se colocará en un recuadro al ordenar y eso es algo ineficaz. Si puede restringir TKey
a un tipo de valor específico, puede evitar este problema.
Posible duplicado de [¿Cómo especifico dinámicamente el argumento Linq OrderBy?] (Http://stackoverflow.com/questions/7265186/how-do-i-specify-the-linq-orderby-argument-dynamically) – Korayem
Aquí es una buena respuesta. Sin ninguna tercera biblioteca. https://stackoverflow.com/a/233505/714828 –