【发布时间】:2010-10-26 13:09:02
【问题描述】:
我们有一个通用 List(Of Product),它必须根据 Product 类的两个或多个属性进行排序。
产品类具有“流行”数字 (asc)、“点击”数字 (desc)、“名称”字符串 (asc) 属性。为了命名属性,我们希望对列表进行排序。
如何使用 Lamba 语句进行排序?如果您发现根据一个属性对列表进行排序。
【问题讨论】:
标签: .net vb.net generics sorting lambda
我们有一个通用 List(Of Product),它必须根据 Product 类的两个或多个属性进行排序。
产品类具有“流行”数字 (asc)、“点击”数字 (desc)、“名称”字符串 (asc) 属性。为了命名属性,我们希望对列表进行排序。
如何使用 Lamba 语句进行排序?如果您发现根据一个属性对列表进行排序。
【问题讨论】:
标签: .net vb.net generics sorting lambda
编辑 刚刚意识到这是一个 VB 问题。这是VB.Net的解决方案
Dim list = GetSomeList()
Dim sorted = list. _
OrderBy(Function(x) x.Popular). _
ThenBy(Function(x) x.Clicked). _
ThenBy(Function(x) x.Name)
C# 版本。试试下面的
var list = GetSomeList();
var sorted = list.OrderBy(x => x.Popular).ThenBy(x => x.Clicked).ThenBy(x => x.Name);
【讨论】:
回答您关于 lambda 表达式的问题,因为 VB 不支持多行 lambda 表达式,所以太复杂而无法放入 lambda 表达式。
对于非 LINQ 解决方案:
您需要一个命名方法作为比较器:
Private Function Comparer(ByVal x As Product, ByVal y As Product) As Integer
Dim result As Integer = x.Popular.CompareTo(y.Popular)
If result = 0 Then
result = x.Clicked.CompareTo(y.Clicked)
If result = 0 Then
result = x.Name.CompareTo(y.Name)
End If
End If
Return result
End Function
用法:
theList.Sort(AddressOf Comparer)
【讨论】:
List<Product> sortedProducts = null;
sortedProducts = products.OrderBy(p => p.Popular)
.ThenByDescending(p => p.Clicked)
.ThenBy(p => p.Name)
.ToList();
【讨论】:
对不起,你知道 C# 吗?
products.OrderBy(p => p.Popular).
ThenByDescending(p => p.Clicked).
ThenBy(p => p.Name);
你能从中得到你需要的东西吗?
【讨论】:
也可以使用 List.Sort lambda 函数完成复合排序。这是一个 vb.Net 示例:
Dim Conts As List(of clsContact)
Conts.Sort(Function(C1 As clsContact, C2 As clsContact)
Dim CompRes As Integer = C1.Contact_LastName.CompareTo(C2.Contact_LastName)
If CompRes = 0 Then
CompRes = C1.Contact_FirstName.CompareTo(C2.Contact_FirstName)
End If
Return CompRes
End Function)
【讨论】: