根据两个或多个值对通用列表进行排序
Posted
技术标签:
【中文标题】根据两个或多个值对通用列表进行排序【英文标题】:Sort Generic list on two or more values 【发布时间】:2010-10-26 13:09:02 【问题描述】:我们有一个通用 List(Of Product),它必须根据 Product 类的两个或多个属性进行排序。
产品类具有“流行”数字 (asc)、“点击”数字 (desc)、“名称”字符串 (asc) 属性。为了命名属性,我们希望对列表进行排序。
如何使用 Lamba 语句进行排序?如果您发现根据一个属性对列表进行排序。
【问题讨论】:
【参考方案1】:编辑 刚刚意识到这是一个 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);
【讨论】:
【参考方案2】:回答您关于 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)
【讨论】:
解决了我遇到的一个问题。谢谢! @Guffa -- VB 确实支持多行 lambda 表达式。 @roryap:是的,现在可以了。不是在写答案的时候。 @Guffa 在你一定不使用LINQ的时候真的很有帮助,谢谢你救了我。【参考方案3】:List<Product> sortedProducts = null;
sortedProducts = products.OrderBy(p => p.Popular)
.ThenByDescending(p => p.Clicked)
.ThenBy(p => p.Name)
.ToList();
【讨论】:
【参考方案4】:对不起,你知道 C# 吗?
products.OrderBy(p => p.Popular).
ThenByDescending(p => p.Clicked).
ThenBy(p => p.Name);
你能从中得到你需要的东西吗?
【讨论】:
太棒了!我不知道“ThenBy”【参考方案5】:也可以使用 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)
【讨论】:
以上是关于根据两个或多个值对通用列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章