2013-02-16 5 views
5

나는 이것에 대한 몇 가지 질문을 보았습니다.ForEach 루프는 클래스의 속성을 변경하지 않습니다.

내 이해는 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; 
} 

결과가 "키워드"가 표시 얻을 일단 내가 다음 코드를 사용하여 윈도우 스토어 앱 일하고

속성은 "여기에 키워드 설정"입니다. foreach 루프에 중단 점을 넣으면 결과 개체가 수정되지 않는 것을 볼 수 있습니다.

무슨 일이 벌어지고 있는지에 대한 아이디어가 있습니까? 나는 명백한 무엇인가 놓치고 있냐? IEnumerable은 Windows Store 응용 프로그램 용 .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은 반복 할 때마다 실행되는 쿼리입니다. 귀하의 경우에는 두 번 평가됩니다. 한 번은 for 루프에서, 두 번째는 데이터 바인딩입니다.

당신은 당신은 당신의 변화가 지속 것을 볼 수이

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

관련 문제