我的app.config中有一个ConfigurationSection,其中包含一个http端点列表(~50)。每个都有一个可选的优先级(以及默认值)。
我想按顺序显示此列表。
Dim Config As MyConfigSection = DirectCast(System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None).Sections("MySection"), MyConfigSection)
Dim Endpoints = MyConfigSection.InitialEndpoints
在这种情况下,InitialEndpoints
的类型为Endpointcollection
,它继承ConfigurationElementCollection
,只是一个松散类型的noddy集合。
Endpoint集合恰好处理EndpointDefinition
s而Url
,Priority
等......
我希望能够......
For Each E in Endpoints.OrderBy(function(x) x.Priority)
...
Next
我是否真的需要创建一个新的列表/集合并将对象传输过来,然后像我一样投射它们?
作为IEnumerable
作弊和转换集合导致无效演员阵容(并非完全出乎意料)
另一种想法是做一些像......
Endpoints.Select(function(x) DirectCast(x, Endpointdefinition)).OrderBy(...)
但是EndpointCollection
不是列表,因此不会从LINQ Select()
扩展中受益。我总是可以实现IList
,但现在感觉我正在使用大锤来破解坚果。
有人可以指出明显的方法吗?作为参考,我的EndpointCollection低于
<ConfigurationCollection(GetType(EndpointDefinition), AddItemName:="Endpoint")>
Public Class EndpointCollection
Inherits ConfigurationElementCollection
Protected Overloads Overrides Function CreateNewElement() As ConfigurationElement
Return New EndpointDefinition
End Function
Protected Overrides Function CreateNewElement(elementName As String) As ConfigurationElement
Return New EndpointDefinition With {.Url = elementName}
End Function
Protected Overrides Function GetElementKey(element As ConfigurationElement) As Object
Return DirectCast(element, EndpointDefinition).Url
End Function
Public Overrides ReadOnly Property CollectionType As ConfigurationElementCollectionType
Get
Return ConfigurationElementCollectionType.AddRemoveClearMap
End Get
End Property
Public Shadows Property Item(index As Integer) As EndpointDefinition
Get
Return CType(BaseGet(index), EndpointDefinition)
End Get
Set(value As EndpointDefinition)
If Not (BaseGet(index) Is Nothing) Then
BaseRemoveAt(index)
End If
BaseAdd(index, value)
End Set
End Property
End Class
答案 0 :(得分:3)
您的问题是,您的班级实施IEnumerable
,而不是IEnumerable(Of T)
。
由于EndpointCollection
继承ConfigurationElementCollection
和ConfigurationElementCollection
实施IEnumerable
,您可以使用OfType()
扩展方法(或Cast()
,如果您需要)。
所以你应该能够做到以下几点:
Dim Endpoints = MyConfigSection.InitialEndpoints.OfType(Of Endpointdefinition).OrderBy(function(x) x.Priority)
或
Dim Endpoints = MyConfigSection.InitialEndpoints.Cast(Of Endpointdefinition).OrderBy(function(x) x.Priority)