2013-02-16 16 views
5

私はこれに関するいくつかの質問を見て、いくつかの調査を行いました。For Eachループはクラスのプロパティを変更していません

IEnumerableでforeachを実行すると、Tが参照型(たとえばクラス)である場合、ループ内からオブジェクトのプロパティを変更できるはずです。 Tが値型(Structなど)の場合、反復変数はローカルコピーであるため、これは機能しません。

私のクラス:

public class WebResult 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string DisplayUrl { get; set; } 
    public string Url { get; set; } 
    public string TileColor 
    { 
     get 
     { 
      string[] colorArray = { "FFA200FF", "FFFF0097", "FF00ABA9", "FF8CBF26", 
      "FFA05000", "FFE671B8", "FFF09609", "FF1BA1E2", "FFE51400", "FF339933" }; 
      Random random = new Random(); 
      int num = random.Next(0, (colorArray.Length - 1)); 
      return "#" + colorArray[num]; 
     } 
    } 
    public string Keywords { get; set; } 
} 

コード:

IEnumerable<WebResult> results = from r in doc.Descendants(xmlnsm + "properties") 
           select new WebResult 
           { 
            Id = r.Element(xmlns + "ID").Value, 
            Title = r.Element(xmlns + "Title").Value, 
            Description = r.Element(xmlns + 
                 "Description").Value, 
            DisplayUrl = r.Element(xmlns + 
                 "DisplayUrl").Value, 
            Url = r.Element(xmlns + "Url").Value, 
            Keywords = "Setting the keywords here" 
           }; 

foreach (WebResult result in results) 
{ 
    result.Keywords = "These, are, my, keywords"; 
} 

if (control is GridView) 
{ 
    (control as GridView).ItemsSource = results; 
} 

結果が "キーワード" を表示し得れば、私は次のコードでWindowsストアアプリに取り組んでいます

プロパティは "ここにキーワードを設定する"です。 foreachループにブレークポイントを置くと、結果オブジェクトが変更されていないことがわかります...

何が起こっているかについてのアイデアはありますか?明白な何かが欠落していますか? IEnumerableはWindowsストアアプリケーションの.NETでは異なる動作をしますか?

+1

Resharperが手元にある場合は、「可能な複数のIEnumerableの列挙」という警告がヒントになることがあります。列挙ごとに新しいコレクションを生成しています。 –

+0

[[IEnumerableの変更はクエリ間で保持されていません]]の重複可能性があります(http://stackoverflow.com/questions/4083771/changes-to-an-ienumerable-are-being-kept-between-queries) – R0MANARMY

答えて

6

これはdeferred executionとして知られています。 resultsは、繰り返し処理するたびに実行されるクエリです。あなたのケースでは、それは2回評価されます.1回はforループで、もう1度はデータバインドされます。

あなたは、あなたの変更が持続していることを確認する必要があり、この

var results2 = results.ToList(); 

foreach (WebResult result in results2) 
{ 
    result.Keywords = "These, are, my, keywords"; 
} 

if (control is GridView) 
{ 
    (control as GridView).ItemsSource = results2; 
} 

ような何かをすることによってこれを確認することができます。

+0

IEnumerable – Sunny

+0

ありがとう、私は可能な重複リンクからそれを得た。複数の反復によるものです。 – Sunny

+0

@SundeepおそらくIEnumerableの意味を誤解しているので、それほど多くの繰り返しはありません。多くの人がこのミスを初めて犯します。 – R0MANARMY

関連する問題