CoderWil Ответов: 1

Как удалить запись из списка иерархии (объекта)


Я выбираю свой XML-файл в объект IEnumerable, а затем преобразую его в список (объекта). Теперь я хочу найти и удалить некоторую запись из базы списка по совпадающему идентификатору. Как это сделать?

Пример моего XML-файла
<?xml version="1.0" encoding="utf-8" ?>
<groups defaultIcon="resources/images/modules-icons/icon.png">
  <group title="Customer">
    <item>
      <title>Customer File</title>
      <item-icon>resources/images/modules-icons/CustomerSupplierFile48x48.png</item-icon>
      <id>customers</id>
    </item>

    <item>
      <title>Customer Group</title>
      <item-icon>resources/images/modules-icons/sink.png</item-icon>
      <id>customers</id>
    </item>

    <item>
      <title>Shipping Address</title>
      <id>customershippingaddress</id>
    </item>


  </group>
  
  <group title="Supplier">
    <item>
      <title>Suppliers Setup</title>
      <item-icon>resources/images/modules-icons/CustomerSupplierFile48x48.png</item-icon>
      <id>suppliers</id>
    </item>

    <item>
      <title>Supplier</title>
      <id>supplier</id>
    </item>

  </group>
  
  <group title="Other group">
    <item>
      <title>Inventory</title>
        <id>inventory</id>
    </item>

    <item>
      <title>Suppliers</title>
      <id>suppliers</id>
    </item>

    <item>
      <title>Help</title>
      <id>help</id>
    </item>

    <item>
      <title>Options</title>
      <id>options</id>
    </item>

    <item>
      <title>Employees</title>
      <id>employees</id>
    </item>
  </group>
</groups>


Dim document As XElement = XElement.Load(Server.MapPath("resources/MasterFiles.xml"))
         Dim defaultIcon As String = If(document.Attribute("defaultIcon") IsNot Nothing, document.Attribute("defaultIcon").Value, "")

         Dim query As IEnumerable(Of Object) = From g In document.Elements("group")
                                               Select New With {
                                                    .Title = If(g.Attribute("title") IsNot Nothing, g.Attribute("title").Value, ""),
                                                    .Items = (From i In g.Elements("item")
                                                              Select New With {

                                                             .Title = 
If(i.Element("title") IsNot Nothing, i.Element("title").Value, ""),
                                                             .Icon = If(i.Element("item-icon") IsNot Nothing, i.Element("item-icon").Value, defaultIcon),
                                                             .Id = If(i.Element("id") IsNot Nothing, i.Element("id").Value, ""),
                                                             .Visible = "Y"
                                                       })
                                            }

         ''Then convert it into List() for easy manage
         ''
         Dim qlist As List(Of Object) = query.ToList()


Вот что я пытаюсь сделать, но знаю, как удалить совпадающую запись

   For x = qlist.Count - 1 To 0 Step -1
                'Loop tru And get user module access
                For Each itm In qlist(x).Items
                    If itm.Id = "customershippingaddress" Then
'I can find it but how to do next?

                    End If
                Next
            Next


Что я уже пробовал:

   For x = qlist.Count - 1 To 0 Step -1
                'Loop tru And get user module access
                For Each itm In qlist(x).Items
                    If itm.Id = "customershippingaddress" Then
'I can find it but how to do next?

                    End If
                Next
            Next

1 Ответов

Рейтинг:
2

OriginalGriff

Вы не можете удалять элементы в списке внутри каждого цикла-он изменяет список, в котором вы находитесь, и это всегда будет вызывать исключение, и очень правильно.
Измените свой For Each на For и работайте в обратном направлении от конца к началу, и вы можете удалить их нормально.
Кроме того, создайте новый список и добавьте в него каждый элемент, который вы хотите удалить, а затем используйте второй для каждого цикла вызова List.Remove для каждого из них.

- понятия не имею, как это сделать правильно, и я ищу здесь помощи.
"Измените свой для каждого На Для, и работать в обратном направлении от конца к началу, и вы можете удалить их прекрасно.""


Ну, вы знаете, как изменить a для каждого на A для:

Dim myList As New List(Of String)()
For Each s As String In myList
    Console.WriteLine(s)
Next
Становится:
Dim myList As New List(Of String)()
For i As Integer = 0 To myList.Length - 1
	Dim s As String = myList(i)
	Console.WriteLine(s)
Next
- Да?
Так пишут, так он бежит от наивысшего показателя до самого низкого:
Dim myList As New List(Of String)()
For i As Integer = myList.Length - 1 To 0 Step -1
	Dim s As String = myList(i)
	Console.WriteLine(s)
Next
Таким образом, когда вы удаляете элемент, он не изменяет индекс следующего элемента, на который вы будете смотреть:
Dim myList As New List(Of String)()
For i As Integer = myList.Length - 1 To 0 Step -1
	Dim s As String = myList(i)
	If s.StartsWith("Delete me") Then
		myList.Remove(s)
	End If
Next
Есть смысл?


CoderWil

Спасибо за ваше предложение. Я испробовал несколько методов, включая метод "для". Однако я не мог получить подэлементы. Буду признателен, если вы дадите мне знать о своем предложении.

OriginalGriff

Вы не можете преобразовать для каждого цикла в циклы For самостоятельно?
Ты ведь шутишь, правда?

CoderWil

У меня нет ни малейшего понятия, как это сделать правильно, и я ищу здесь помощи.
"Измените свой для каждого На Для, и работать в обратном направлении от конца к началу, и вы можете удалить их прекрасно."

OriginalGriff

Ответ обновлен

CoderWil

Спасибо тебе, Оригиналгрифф.

OriginalGriff

Пожалуйста!