.net 按两个或多个值对通用列表排序

.net 按两个或多个值对通用列表排序,.net,vb.net,generics,sorting,lambda,.net,Vb.net,Generics,Sorting,Lambda,我们有一个通用列表(产品),它必须根据产品类的两个或多个属性进行排序 product类具有属性“Popular”numeric(asc)、“Clicked”numeric(desc)、“Name”string(asc)。按照命名属性的顺序,我们希望对列表进行排序 如何使用Lamba语句进行排序?如果您发现要根据一个属性对列表进行排序。很抱歉,您知道任何C#吗 你能从中得到你需要的吗?EDIT刚刚意识到这是一个VB问题。下面是VB.Net解决方案 Dim list = GetSomeList()

我们有一个通用列表(产品),它必须根据产品类的两个或多个属性进行排序

product类具有属性“Popular”numeric(asc)、“Clicked”numeric(desc)、“Name”string(asc)。按照命名属性的顺序,我们希望对列表进行排序


如何使用Lamba语句进行排序?如果您发现要根据一个属性对列表进行排序。

很抱歉,您知道任何C#吗


你能从中得到你需要的吗?

EDIT刚刚意识到这是一个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表达式的问题,这太复杂了,无法放入lambda表达式中,因为VB不支持多行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 sortedProducts=null;
sortedProducts=products.OrderBy(p=>p.Popular)
.然后按降序(p=>p.Clicked)
.ThenBy(p=>p.Name)
.ToList();

也可以使用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)

解决了我遇到的一个问题。谢谢@Guffa--VB确实支持多行lambda表达式。@roryap:是的,现在支持了。答案写出来的时候没有。@Guffa当你保证不使用LINQ时真的很有帮助,谢谢你救了我。太棒了!我不知道“ThenBy”的事
List<Product> sortedProducts = null;
sortedProducts = products.OrderBy(p => p.Popular)
                         .ThenByDescending(p => p.Clicked)
                         .ThenBy(p => p.Name)
                         .ToList();
    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)