Как я могу удалить узлы из коллекции SiteMapNodeCollection?

#stack-overflow #questions #polling

Вопрос:

У меня есть повторитель, в котором перечислены все web.sitemap дочерние страницы на ASP.NET страница. Ее DataSource зовут SiteMapNodeCollection А. Но я не хочу, чтобы там отображалась страница моей регистрационной формы.

 Dim Children As SiteMapNodeCollection = SiteMap.CurrentNode.ChildNodes

'remove registration page from collection
For Each n As SiteMapNode In SiteMap.CurrentNode.ChildNodes
If n.Url = "/Registration.aspx" Then
    Children.Remove(n)
End If
Next

RepeaterSubordinatePages.DataSource = Children
 

SiteMapNodeCollection.Remove() Метод выбрасывает

Исключение NotSupportedException: «Коллекция доступна только для чтения».

Как я могу удалить узел из коллекции перед привязкой ретранслятора к базе данных?

Ответ №1:

Ваш тип не должен нуждаться в CType

 Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
 

Ответ №2:

Использование Linq и .Net 3.5:

 //this will now be an enumeration, rather than a read only collection
Dim children = SiteMap.CurrentNode.ChildNodes.Where( _
    Function (x) x.Url <> "/Registration.aspx" )

RepeaterSubordinatePages.DataSource = children 
 

Без Linq, но с использованием .Net 2:

 Function IsShown( n as SiteMapNode ) as Boolean
    Return n.Url <> "/Registration.aspx"
End Function

...

//get a generic list
Dim children as List(Of SiteMapNode) = _
    New List(Of SiteMapNode) ( SiteMap.CurrentNode.ChildNodes )

//use the generic list's FindAll method
RepeaterSubordinatePages.DataSource = children.FindAll( IsShown )
 

Избегайте удаления предметов из коллекций, так как это всегда происходит медленно. Если вы не собираетесь перебирать несколько раз, вам лучше фильтровать.

Ответ №3:

Я заставил его работать с кодом ниже:

 Dim children = From n In SiteMap.CurrentNode.ChildNodes _
               Where CType(n, SiteMapNode).Url <> "/Registration.aspx" _
               Select n
RepeaterSubordinatePages.DataSource = children
 

Есть ли лучший способ, которым мне не нужно пользоваться CType() ?

Кроме того, это устанавливает для детей значение a System.Collections.Generic.IEnumerable(Of Object) . Есть ли хороший способ вернуть что-то более строго типизированное, например a System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode) или даже лучше a System.Web.SiteMapNodeCollection ?