考慮下面的代碼:LINQ中,將XMLNode,的foreach的和異常
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();
}
}
}
當我在運行此代碼的Visual Studio 2010表達我沒有得到一個異常,符合市場預期。我希望有一個,因爲我在迭代時從列表中刪除某些東西。
我要做的得到的是一個列表返回僅在第一個子節點刪除:
爲什麼我沒有得到一個無效的操作異常?
注意,在IDEOne.com的equivilent代碼確實給預期的異常:http://ideone.com/qoRBbb
還要注意的是,如果我刪除所有的LINQ(.Cast().Where()
)我得到相同的結果,只有一個節點中刪除, 沒有例外。
在VSExpress中我的設置有問題嗎?
注意,我知道延遲執行涉及,但是我希望在where子句中,當迭代時在源枚舉(子注),這將使我預期的異常進行迭代。我的問題是,我沒有在VSexpress中得到這個異常,但是在IDEOne中(我期望它在兩種/所有情況下,或者至少如果不是這樣,我期望得到正確的結果)。
從Wouter's answer似乎當第一個孩子被刪除,但是無效的迭代器,而不是讓一個例外。有什麼官員說這個嗎?這種行爲在其他情況下是可以預料的嗎?我會無聲地調用迭代器而不是用「沉默但致命」的異常。
我在結果中看不到'Console.WriteLine(「Removing:」);'的輸出。你確定這個循環觸發了嗎? – Impworks
頂部 – IronMan84
對不起,已編輯截圖(在初始測試後添加了檢查/演示) –