2014-10-15 6 views
-2

저는이 문제에 대해 매우 혼란스럽고이 질문의 제목을 지정하는 방법을 모르겠습니다.IList의 루프에서 데이터 멤버를 수정하면 IList의 다른 요소가 수정됩니다.

나는 내 수업 중 하나의 IList를 만든 다음 .Add()를 사용하여 IList를 채 웁니다. 일단 IList가 채워지면 IList를 통해 반복하여 일부 값을 확인한 다음 각 요소의 데이터 멤버 중 하나를 0.00으로 설정해야합니다.

한 요소의 데이터 멤버를 설정하면 다음 요소의 동일한 데이터 멤버도 설정된다는 것이 문제입니다. 나는이 같은 MyClass에 사용하고

public class MyClass 
{ 
    private int _Id; 
    private string _ModelName; 
    private double _Price; 

    public int Id 
    { 
     get { return _Id; } 
     set { _Id = value; } 
    } 

    public string ModelName 
    { 
     get { return _ModelName; } 
     set { _ModelName= value; } 
    } 

    public double Price 
    { 
     get { return _Price; } 
     set { _Price = value; } 
    } 
} 

: 다음은 코드의 예입니다

IList<MyClass> MyClasses = new List<MyClass>(); 

MyClasses.Add(new MyClass { Id = 1, ModelName = "Model1", Price = 119310.05 }); 
MyClasses.Add(new MyClass { Id = 2, ModelName = "Model1", Price = 119310.05 }); 
MyClasses.Add(new MyClass { Id = 3, ModelName = "Model1", Price = 119310.05 }); 
MyClasses.Add(new MyClass { Id = 4, ModelName = "Model1", Price = 119310.05 }); 
MyClasses.Add(new MyClass { Id = 5, ModelName = "Model2", Price = 19810.32 }); 
MyClasses.Add(new MyClass { Id = 6, ModelName = "Model2", Price = 19810.32 }); 
MyClasses.Add(new MyClass { Id = 7, ModelName = "Model2", Price = 19810.32 }); 

foreach(MyClass myclass in MyClasses) 
{ 
    ... do something ... 

    myclass.Price = 0.00; 

    ... do something ... 
} 

확인, 위의 코드 내 실제 코드의 매우 간단한 표현입니다. 무슨 일이 일어나고 foreach 루프에 myclass.Price = 0.00;을 설정하면 ModelName과 일치하는 모든 Price 데이터 멤버가 0.00으로 변경됩니다. 요구되는

나는이 느낌
MyClasses.Add(new MyClass { Id = 1, ModelName = "Model1", Price = 0.00 }); 
MyClasses.Add(new MyClass { Id = 2, ModelName = "Model1", Price = 0.00 }); 
MyClasses.Add(new MyClass { Id = 3, ModelName = "Model1", Price = 0.00 }); 
MyClasses.Add(new MyClass { Id = 4, ModelName = "Model1", Price = 0.00 }); 
MyClasses.Add(new MyClass { Id = 5, ModelName = "Model2", Price = 19810.32 }); 
MyClasses.Add(new MyClass { Id = 6, ModelName = "Model2", Price = 19810.32 }); 
MyClasses.Add(new MyClass { Id = 7, ModelName = "Model2", Price = 19810.32 }); 

은 완전히 바보 같은 질문 내가 것 : 그래서, foreach 루프에서 나는 즉시 IList의에이 메시지가 표시되는 0.00 = 가격에 아이디 = 1 요소를 설정할 때 아마 그 일에 대해 똑같이 어리석은 이유를 찾게 될 것입니다. 필자는 F11을 사용하여 코드의 모든 라인을 단계별로 설명하고 가격이 다른 요소에 설정되는 곳을 보지 않습니다. MyClass는 IList에 포함되어 있다는 사실을 완전히 인식하고 있습니다.

루프 자체에서 발생하는 것으로 보입니다. 루프를 통해 스테핑

MyClasses[p].Price 
MyClasses[p + 1].Price 
MyClasses[p + 2].Price 
MyClasses[p + 3].Price 
MyClasses[p + 4].Price 

MyClasses[p].Price이 0.00로 다른 모든 요소를 ​​설정하면 것을 보여줍니다 : 나는 시계를 추가 한

for (int p = 0; p < MyClasses.Count; p++) 
{ 
    ... do something ... 

    myclass[p].Price = 0.00; 

    ... do something ... 
} 

: 나는 또한 같은 행동이 방법을 시도했습니다 '가격 멤버가 0.00으로 설정됩니다.

내 수업에서 원인이되는 것 이외의 다른 문제에 대한 가능한 설명이 있습니까? 아마도 IList와 관련이 있습니까?

+0

루프의 ModelName이나 Price의 getter/setter 클래스를 참조하지 않았습니다. F11로 전체 루프를 추적했습니다. Price 데이터 멤버는 모두 MyClass.Price setter에서 반환 된 후 동시에 같은 라인 ('myclass.Price = 0.00')에 설정됩니다. 솔직히 내 코드가 어떻게 작동하는지 알지 못합니다 ... – rwkiii

+2

IList 인터페이스의 새 인스턴스를 만들 수 없기 때문에 실제 코드를 게시하지 않았다고 알 수 있습니다. 나는. "new IList "은 불법입니다. 귀하의 질문에 대한 가장 확실한 대답은 당신이 실제로 각 고유 한 ModelName 값에 대해 MyClass의 단일 인스턴스에 동일한 참조를 복사한다는 것입니다. 따라서 목록에 여러 인스턴스에 동일한 인스턴스가 있습니다. 그러나 간결하지만 완전한 코드 예제가 없다면 확실히 말할 수는 없습니다. –

+0

또한 소식을 업데이트 할 때 MyClass를 단순화하여 각 속성이 예를 들어"public int Id {get; set;}". 좋은 질문을하기 위해, 당신은 가장 가독성이 높고 문제를 입증 할 수있는 가장 짧은 코드를 게시해야합니다. 명시 적으로 구현 된 속성은이 작업을 수행하지 않습니다. –

답변

2

귀하의 질문에 대한 가장 확실한 대답은 실제로 각 고유 한 ModelName 값에 대해 MyClass의 단일 인스턴스에 동일한 참조를 복사한다는 것입니다. 따라서 귀하의 목록에는 여러 개의 동일한 인스턴스가 있습니다. 그러나 간결하지만 완전한 코드 예제가 없다면 확실히 말할 수는 없습니다.