如何在VB.Net中对System.Collections.Generic.List进行排序?

30

我正在使用一个通用列表(m_equipmentList),它是对象(Schedule_Payitem)的集合。
如何根据子对象的属性对列表进行排序?

Dim m_equipmentList As New List(Of Schedule_Payitem)

需要根据 Schedule_Payitem 的 resourceid 属性对 m_equipmentList 进行排序。


谢谢您的提问。我能够在我的一个项目中使用Jon Skeet的lambda表达式。 - tooleb
4个回答

59
你正在使用VB9吗?如果是的话,我建议使用lambda表达式来创建一个Comparer(Of Schedule_PayItem)。否则,请编写一个简短的类来实现IComparer(Of Schedule_PayItem)。将任何一个传递到List.Sort中。 lambda表达式的示例(未经测试):
m_equipmentList.Sort(Function(p1, p2) p1.ResourceID.CompareTo(p2.ResourceID))

对于 IComparer(Of Schedule_PayItem):

Public Class PayItemResourceComparer
    Implements IComparer(Of Schedule_PayItem)
    Public Function Compare(ByVal p1 As Schedule_PayItem, _
                            ByVal p2 As Schedule_PayItem) As Integer
        Return p1.ResourceID.CompareTo(p2.ResourceID)
    End Function
End Class

...

m_equipmentList.Sort(New PayItemResourceComparer)

4
指定Collections.Generic.IComparer(Of Schedule_PayItem)的有用提示。我遇到了一个错误:“System.Collections.IComparer”没有类型参数。经过一些搜索,我发现存在两个同名的接口,一个在System.Collections中,另一个在System.Collections.Generic中。 - Kyle B.

7

我不会vb.net,所以我用C#完成了它。

m_equipmentList.Sort(
   (payItem1,payItem2)=>payItem1.ResourceID.CompareTo(payItem2.ResourceID));

使用反射器将其转换为VB.NET,希望能有所帮助。

m_equipmentList.Sort(
Function (ByVal payItem1 As Schedule_Payitem, ByVal payItem2 As Schedule_Payitem) 
    Return payItem1.ResourceID.CompareTo(payItem2.ResourceID)
End Function)

你可以继承自IComparable的Schedule_Payitem,然后实现CompareTo方法并调用“m_equipmentList.Sort()”。

这是解决许多问题的好方法 :D - CodingBarfield

5
您可以通过更改以下内容来按降序对列表进行排序-
m_equipmentList.Sort(
Function (ByVal payItem1 As Schedule_Payitem, ByVal payItem2 As Schedule_Payitem) 
    Return payItem1.ResourceID.CompareTo(payItem2.ResourceID)
End Function)

转化为这样

m_equipmentList.Sort(
Function (ByVal payItem1 As Schedule_Payitem, ByVal payItem2 As Schedule_Payitem) 
    Return payItem2.ResourceID.CompareTo(payItem1.ResourceID)
End Function)

0

试试这个

Dim m_equipmentList As New List(Of Schedule_Payitem)


m_equipmentList.Sort(delegate(Schedule_Payitem p1, Schedule_Payitem p2)
              {
                  return p1.resourceid .CompareTo(p2.resourceid );
              });

1
VB.Net 直到 vs2008 才支持匿名委托,因此从这段代码的转换可能并不简单。 - Joel Coehoorn
你的代码是C#和VB.Net混合的!行末的分号是用于C#的! - schlebe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接