Rozważmy następujący kod:LINQ XmlNodes, foreach tych i wyjątki
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(@"<Parts>
<Part name=""DisappearsOk"" disabled=""true""></Part>
<Part name=""KeepMe"" disabled=""false""></Part>
<Part name=""KeepMe2"" ></Part>
<Part name=""ShouldBeGone"" disabled=""true""></Part>
</Parts>");
XmlNode root = xmlDoc.DocumentElement;
List<XmlNode> disabledNodes = new List<XmlNode>();
try
{
foreach (XmlNode node in root.ChildNodes.Cast<XmlNode>()
.Where(child => child.Attributes["disabled"] != null &&
Convert.ToBoolean(child.Attributes["disabled"].Value)))
{
Console.WriteLine("Removing:");
Console.WriteLine(XDocument.Parse(node.OuterXml).ToString());
root.RemoveChild(node);
}
}
catch (Exception Ex)
{
Console.WriteLine("Exception, as expected");
}
Console.WriteLine();
Console.WriteLine(XDocument.Parse(root.OuterXml).ToString());
Console.ReadKey();
}
}
}
Kiedy uruchomić ten kod w visual studio wyrażania 2010 Nie rozumiem wyjątek, zgodnie z oczekiwaniami. Spodziewałbym się jednego, ponieważ usuwam coś z listy podczas iteracji.
Co zrobić dostać to lista z powrotem tylko usuwa pierwszy węzeł dziecko:
Dlaczego nie otrzymuję wyjątek niepoprawnego działania?
Należy pamiętać, że kod equivilent w IDEOne.com daje oczekiwany wyjątek: http://ideone.com/qoRBbb
Należy również zauważyć, że jeśli usunąć wszystkie LINQ (.Cast().Where()
) uzyskać ten sam rezultat, usunięto tylko jeden węzeł , bez wyjątku.
Czy jest jakiś problem z moimi ustawieniami w VSExpress?
Zauważ, że wiem, że wykonanie odroczony jest zaangażowany, ale czego można oczekiwać w przypadku gdy klauzula, kiedy powtórzyć po iteracyjne na wyliczenie źródłowego (uwaga dziecko), która dałaby wyjątek Czekam.
Mój problem polega na tym, że nie mam tego wyjątku w VSexpress, ale robię to w IDEOne (spodziewałbym się tego w obu/wszystkich przypadkach, a przynajmniej jeśli nie, oczekiwałbym poprawnego wyniku).
Od Wouter's answer wydaje się to unieważniania iterator kiedy pierwsze dziecko jest usuwany, a nie dając wyjątek. Czy jest coś oficjalnego, co mówi to? Czy tego zachowania można się spodziewać w innych przypadkach? Nazwałbym unieważnianie iteratora po cichu, a nie z wyjątkiem "Milczący, ale zabójczy".
Nie widzę danych wyjściowych 'Console.WriteLine (" Usuwanie: ");' w twoim wyniku. Jesteś pewien, że pętla się w ogóle strzela? – Impworks
Jest na górze – IronMan84
Przepraszam, edytowany zrzut ekranu (dodano test/demonstrację po początkowym teście) –