3

我想对实现 IEnumerable 的 VB 类进行排序。我不想要一个新的对象/ linq。它必须保持为原始对象但已排序。这是一个示例类。

Public Class Person
    Public Sub New(ByVal fName As String, ByVal lName As String)
        Me.firstName = fName
        Me.lastName = lName
    End Sub

    Public firstName As String
    Public lastName As String
End Class

Public Class People
    Implements IEnumerable(Of Person)

    Private _people() As Person

    Public Sub New(ByVal pArray() As Person)
        _people = New Person(pArray.Length - 1) {}

        Dim i As Integer
        For i = 0 To pArray.Length - 1
            _people(i) = pArray(i)
        Next i
    End Sub

    Public Function GetEnumerator() As IEnumerator(Of Person) _
            Implements IEnumerable(Of Person).GetEnumerator
        Return DirectCast(_people, IEnumerable(Of Person)).GetEnumerator
    End Function

    Private Function System_Collections_GetEnumerator() As IEnumerator _
            Implements IEnumerable.GetEnumerator
        Return Me.GetEnumerator
    End Function
End Class

我知道我可以使用 LINQ,但后来我得到了一个新对象,而不是原来的排序对象。有太多地方使用全局“peopleList”对象,所以我需要对“peopleList”进行排序,而不是对“People”的新排序列表进行排序。

Dim peopleList As New People({ _
    New Person("John", "Smith"), _
    New Person("Jim", "Johnson"), _
    New Person("Sue", "Rabon")})
Dim newPeopleList = From person In peopleList Order By person.firstName Select person
'OR
Dim newPeopleList = DirectCast(peopleList, IEnumerable(Of Person)).ToList()
newPeopleList.Sort(Function(p1, p2) p1.firstName.CompareTo(p2.firstName))

我需要更像下面的东西。

Dim peopleList As New People({ _
    New Person("John", "Smith"), _
    New Person("Jim", "Johnson"), _
    New Person("Sue", "Rabon")})
peopleList = peopleList.Sort(Function(p) p.firstName)

我知道 IEnumerable 没有 Sort 方法。我只是把它作为一个例子来展示。我确实可以选择修改“People”类,但最后它仍然必须实现 IEnumerable,因为我不想破坏当前的调用者。当前调用者也必须能够看到排序的“peopleList”。

4

3 回答 3

6

您可以Person在创建People列表时对对象进行排序:

Public Sub New(ByVal pArray() As Person)
    _people = New Person(pArray.Length - 1) {}

    Dim i As Integer = 0
    For
    For Each person In pArray.OrderBy(Function(p) p.firstName)
        _people(i) = person
        i = i + 1
    Next i
End Sub

或者,您可以提供自己的方法在创建内部数组后对其进行排序。像这样的东西应该工作:

Public Class People
    Public Sub Sort(Of T As IComparable)(KeySelector As Func(Of Person, T))
        Array.Sort(_people, Function(x, y) KeySelector(x).CompareTo(KeySelector(y)))
    End Sub
End Class

你可以这样称呼:

peopleList.Sort(Function(p) p.firstName)
于 2013-11-01T15:13:43.690 回答
1

您可以对底层数组进行排序并使用自定义 IComparer 来适应:

http://msdn.microsoft.com/en-us/library/bzw8611x.aspx

就像是:

public class PersonComparer: IComparer<Person>
{
    public int Compare(Person x, Person y)
    {            
        return x.FirstName.CompareTo(y.FirstName);
    }
}

然后在你的 People 类中:

public sub Sort()

     PersonComparer pc = new PersonComparer()

    Array.Sort(_people, pc)

end sub
于 2013-11-01T15:26:04.280 回答
1

您可以添加一个Sort方法:

Public Sub Sort()
    _people = _people.OrderBy(Function(p) p.firstname).ToArray()
End Sub

Public Sub Sort(Of TKey)(keySelector As Func(Of Person, TKey))
    _people = _people.OrderBy(keySelector).ToArray()
End Sub

或者在返回枚举数时进行排序:

Public Function GetEnumerator() As IEnumerator(Of Person) _
        Implements IEnumerable(Of Person).GetEnumerator
    Return _people.OrderBy(Function(p) p.firstname).GetEnumerator()
End Function
于 2013-11-01T15:48:23.920 回答