2011-07-07 6 views
2

私はIEnumerableの奇妙な動作を発見しました。 Linq to XMLを使ってコレクションを作成し、コレクションをループして要素を変更するよりも、ループを通過するたびにコレクションのサイズが1ずつ減少します。コンテンツを変更するとIEnumerableが減少しますか?

var nodesToChange = from A in root.Descendants() 
         where A.Name.LocalName == "Compile" 
         && A.Attribute("Include").Value.ToLower().Contains(".designer.cs") 
         && A.HasElements && A.Elements().Count() == 1 
         select A; 
    foreach (var node in nodesToChange) { 
      //after this line the collection is reduced 
      node.Attribute("Include").Value = node.Attribute("Include").Value.Replace(".Designer.cs", ".xaml"); 
    } 

しかし、私は、LINQ式の末尾にのみToArray<XElement>()を追加した場合、問題が解決されています。ここでは、私が何を言っているかです。

誰も私にこの理由が説明できますか?ありがとう。

答えて

5

クエリは各ループサイクルで評価されます。

要素はもはやあなたのクエリから返されるので、それは

A.Attribute("Include").Value.ToLower().Contains(".designer.cs") 
ループが固定されたコレクションを列挙クエリの ToArrayまたは ToListを呼び出すことで一致していないとしてあなたは、 Include値を変更していないしています、あなたの操作は影響を与えません。

+0

OKですが、なぜもう一度評価されますか? – Vale

関連する問題