在编程的世界中,寻找更高效、更简洁的方法来解决问题是程序员的职责和乐趣所在。本文将探讨如何使用Lambda表达式和泛型来实现一个通用的排序类。这种技术在参与的项目中找到了它的用武之地,并且认为这是迄今为止所见过的最好的排序对象的方法。
这个类在工具集中已经占据了一席之地,现在将这个类分享给大家。
在处理需要分页和排序的多个网格的项目时,意识到需要一个通用的排序类来完成所有的工作。这个类可以处理任何对象模型,并且能够一次性完成排序任务。
为了提高文章的可读性,将实际实现中的代码进行了简化。阅读完本文后,相信能够像一样,为这种技术找到许多巧妙的用途。
C#示例:
GenericSorter<SurveyStateFormatData> gs = new GenericSorter<SurveyStateFormatData>();
SurveyStateFormatItems = gs.Sort(SurveyStateFormatItems.AsQueryable(), sortExpression, sortDirection).ToArray();
VB.NET示例:
Dim gs As New GenericSorter(Of SurveyStateFormatData)
SurveyStateFormatItems = gs.Sort(SurveyStateFormatItems.AsQueryable(), sortExpression, sortDirection).ToArray()
C#示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
public class GenericSorter<T>
{
public IEnumerable<T> Sort(IEnumerable<T> source, string sortBy, string sortDirection)
{
var param = Expression.Parameter(typeof(T), "item");
var sortExpression = Expression.Lambda<Func<T, object>>(
Expression.Convert(Expression.Property(param, sortBy), typeof(object)), param);
switch (sortDirection.ToLower())
{
case "asc":
return source.AsQueryable().OrderBy(sortExpression);
default:
return source.AsQueryable().OrderByDescending(sortExpression);
}
}
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Linq.Expressions
Public Class GenericSorter(Of T)
Public Function Sort(ByVal source As IEnumerable(Of T), ByVal sortBy As String, ByVal sortDirection As String) As IEnumerable(Of T)
Dim param = Expression.Parameter(GetType(T), "item")
Dim sortExpression = Expression.Lambda(Of Func(Of T, Object))(
Expression.Convert(Expression.Property(param, sortBy), GetType(Object)), param)
Select Case sortDirection.ToLower
Case "asc"
Return source.AsQueryable().OrderBy(sortExpression)
Case Else
Return source.AsQueryable().OrderByDescending(sortExpression)
End Select
End Function
End Class