2013-02-18 41 views
1

我想订购由枚举列表,请参阅以下内容:通过枚举订购列表

Public Class AnimalsToProcess 
Implements ICloneable 

     Enum AnimalOrder 
     Dog 
     Cat 
     Horse 
     Fish 
     End Enum 


    Public Property _animalList As List(Of Animal) 

    Public Sub New() 

    End Sub 

    Function Clone() As AnimalsToProcess 

    End Function 

    Private Function ICloneable_Clone() As Object Implements ICloneable.Clone 
     Return Clone() 
    End Function 

    Public Sub Add(animalToAdd As Animal) 
     _animalList.Add(animalToAdd) 
    End Sub 

    Public Sub GetAnimals() as list(of Animal) 
     _animalList() 'this should be an ordered BY AnimalOrder Enum 
    End Sub 
End Class 

Add方法由外部代码调用通过传递一个值,例如:

animals.add(Fish) 
animals.add(Horse) 
animals.add(Cat)` 

但是当GetAnimals被调用时,它应该返回由Enum AnimalOrder排序的列表。

于是便列表应包含在这个顺序猫,马follwing动物,鱼类

谢谢。

回答

1

枚举在内部为每个值使用整数。如果您没有明确设置它们,它们将按照enum中定义的顺序自动分配,从0开始。

您应该能够将您的字符串值转换为您的枚举并从那里转换为整数。喜欢的东西(未经测试)..

Public Function GetAnimals() as list(of Animal) 
    Return _animalList.OrderBy(function(x) Cint(DirectCast(Enum.Parse(GetType(AnimalOrder), x), AnimalOrder))) 
End Sub 

注意,你指的是价值Animal类型,但不具备的一个定义,你问:如果你需要访问属性来获取价值匹配的枚举,说AnimalTypeString ...

Public Function GetAnimals() as list(of Animal) 
    Return _animalList.OrderBy(function(x) Cint(DirectCast(Enum.Parse(GetType(AnimalOrder), x.AnimalTypeString), AnimalOrder))) 
End Sub 

或如果直接在枚举值(这将是明智的)的AnimalType财产上的动物的点,你可以跳过了转换枚举.. 。

Public Function GetAnimals() as list(of Animal) 
    Return _animalList.OrderBy(function(x) Cint(X.AnimalType)) 
End Sub 
+0

我不得不使用'Cint(DirectCast(Enum.Parse(GetType(AnimalOrder),x.tostring()'得到它的工作,谢谢 – user1770609 2013-02-19 01:36:37

+0

不客气 - 很高兴我可以帮助 - 但我不明白为什么你需要'ToString()'它?当然你的对象有一个暴露动物的属性('MyAnimal.Type'或'MyAnimal.TypeName'或类似的?)如果它不是一个对象,而只是一个字符串,你应该可以使用'x'以及' x.ToString()' – Basic 2013-02-19 10:17:05