根据两个或多个值对通用列表进行排序

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)

【讨论】:

以上是关于根据两个或多个值对通用列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按多个键值对数据进行排序

排序列表颤动

如何根据属性值对对象列表进行排序

如何同时使用两个功能对 RDD 条目进行排序?

根据另一个列表中的值对列表进行排序

Hashtable一个键多个值 在遍历怎么做啊