Итерации LINQ XML

#c# #xml #linq

#c# #xml #linq

Вопрос:

Как я могу добраться до последнего узла XML через C #? Я перебираю XML-документ и проверяю условие на соответствие значению, и когда условие выполнено, я хочу достичь последнего узла, чтобы завершить итерацию. Может кто-нибудь помочь, пожалуйста.

Комментарии:

1. Конечно, кто-нибудь может вам помочь при условии, что вы опубликуете свой код.

2. Итак, что же вы пытались сделать, чтобы добиться этого?

3. внутри блока успеха моего условия я хочу переместить курсор на lastnode xml, чтобы на следующей итерации он вышел из цикла.

4. Было бы здорово привести несколько примеров кода. В общем, выход из циклов можно выполнить с помощью инструкции «break;». Получение последнего элемента в коллекции выполняется с помощью «.Last()». Не могу дать вам больше без некоторых примеров кода.

5. показать свой код? Вы используете XDocument или XmlReader или XmlWriter

Ответ №1:

Это не очень хороший вопрос, но, если я вас правильно понял, вы хотите завершить цикл, когда будет выполнено какое-то условие?

это делается с помощью break;

 for (int i = 1; i <= 100; i  )
    {
        if (i == 5)
        {
            break;
        }            
    }
 

В случае, если вы хотите получить последний элемент в коллекции с помощью LINQ, это делается с помощью оператора «.Last()».

Ответ №2:

Вы могли бы использовать цикл foreach и перебирать каждого потомка. Проверьте условие и, если оно выполнено, выйдите из цикла.

Получите последний элемент заранее и сделайте что-нибудь с ним после выхода из цикла.

 XDocument xDoc = XDocument.Load("myfile.xml");
if(xDoc == null || xDoc.Root == null)
    return;

XElement lastElement = xDoc.Root.Descendants().LastOrDefault();

foreach (XElement element in xDoc.Root.Descendants())
{
    if (condition)
    {
         // your logic
         break;
    }
}
 

Конечно, кажется, что я делаю вашу домашнюю работу, но ради того, чтобы этот ответ был действительным (в следующий раз добавьте эту информацию в свой первоначальный вопрос!), Используйте следующее:

 XElement current = null;

List<XElement> elements = xDoc.Root.Descendants().ToList();
XElement lastElement = elements.LastOrDefault();

for (int i = 0; i < xDoc.Root.Descendants().Count(); i  )
{
    current = elements[i];
    if (condition)
    {
        // Set i to the highest available number which causes the loop stop.
        i = xDoc.Root.Descendants().Count();
    }
}
 

Комментарии:

1. не могу использовать перерыв. Нужна альтернатива

2. Возможно, вам следовало указать это в своем вопросе. Почему вы не можете использовать break?

3. В какой ситуации вы не можете использовать break? Это вопрос домашнего задания / интервью с произвольно наложенными правилами или есть что-то в структуре вашей программы, которая по какой-то причине налагает это ограничение?

4. Там решение без перерыва. Вы могли бы немного повысить производительность, если бы использовали Count() только один раз и сохранили его в переменной перед запуском цикла.

5. Я хотел бы получить от них «почему бы не использовать break -презентацию».