使用 LINQ 和 Lambda 表达式进行通用排序






4.38/5 (7投票s)
这个类使用泛型和 LINQ Lambda 表达式对对象进行排序。
引言
对对象进行排序一直是编程问题,从一门科学发展到仅仅几行代码。虽然它不像我进入这个行业之前那样需要大量的考虑,但它仍然同样重要。本文探讨了使用 Lambda 表达式和泛型进行排序。在我看来,这是迄今为止我见过的对对象进行排序的最佳技术。这个类已经在我的 Utils 程序集中找到了一个确定的位置,所以我与你分享它。
背景
作为程序员,我们始终有责任和乐趣去寻找更好的方法来做同样的事情。这就是我偶然发现这种排序技术的原因。我正在一个项目上工作,该项目有几个需要分页和排序的网格,并且像许多项目一样,我们正在使用对象模型。我正在考虑创建一个通用的排序类,该类在一个地方完成所有工作,而本文分享了结果。
使用代码
为了提高可读性,这些示例从我的实际实现中简化了一些。但是,在查看这段代码之后,我相信你像我一样能够想到几种巧妙的使用这种技术的方法。
排序类的用法
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<T>().OrderBy<T, object>(sortExpression);
default:
return source.AsQueryable<T>().OrderByDescending<T, object>(sortExpression);
}
}
}
VB.NET
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
历史
- 文章添加日期:(2009/06/22)。