2016-07-05 4 views
0

다소 이상한 문제가 발생합니다. List 유형을 반복하고 루프 내에서 반복자 변수를 다른 로컬 객체에 할당합니다. 이제 해당 로컬 객체의 내용을 변경하면 어떤 루프가 반복되는지 List에 변경이 발생합니다. 코드 샘플을 사용하여이를 해결하겠습니다. 반복 목록 값에 영향을 미치는 Foreach 루프 내 계산

var balances = DBHelperADO.Select("select * from Orders"); 
// balances is of type List<MyModel> 

foreach (var item in balances) 
{ 
    MyModel model = new MyModel(); 
    model = item; 
    var thisQty = details.Where(x => x.Code == item.Code).Sum(x => x.QTY); 

    // details is another List<MyModel> holding values from the GUI 

    model.BLNC = model.BLNC - thisQty; 
    model.VAL = (model.BLNC == 0) ? 0 : model.VAL - (thisQty * model.RATE); 
    model.TABLE = "Orders"; 
    toUpdate.Add(model); // toUpdate is a List<MyModel>      
} 

지금 나의 이해는 (이 경우 항목) 반복자 변수는 읽기 전용이다 내가 쓸 때입니다 :

모델 = 항목;

나는 나의 항목 값의 복사본을 만드는 중이라서. 그러나 모델 오브젝트에 대한 계산을 수행하면 잔액리스트에서도 동일한 변경 사항이 발생합니다.

저울리스트에 영향을 미치지 않는 이유가 없습니다. 로컬 스코프 모델 개체에 대해 계산을 수행하고 있습니다. 그렇다면 반복 목록 (잔액)에 반영되는 이유는 무엇입니까?

제가 잘못하고있는 것을 도와주세요.

안부

답변

3

잔액의 요소 유형이 클래스 유형이고 구조체가 아닌 것으로 가정합니다.입니다.

은 그래서 itemmodel에 저장하면 해당 클래스의 예를참조입니다. model = item;을 할당 할 때 인스턴스에 복사하지 말고 참조 만 인스턴스에 복사하십시오.

이제 model.BLNC = ...을 통해 해당 인스턴스의 속성에 액세스하면 원래 인스턴스의 속성이 변경됩니다. item.BLNC = ...

처음 라인 MyModel model = new MyModel()은 새로운 인스턴스에 대한 참조를 덮어 쓸 때 쓸모가 없습니다.당신이

var toUpdate = balances.Select(item => 
    { 
     var thisQty = details.Where(x => x.Code == item.Code).Sum(x => x.QTY); 
     var blnc = item.BLNC - thisQty; 
     return new MyModel 
     { 
      BLNC = blnc, 
      VAL = (blnc == 0) ? 0 : item.VAL - (thisQty * item.RATE), 
      RATE = item.RATE, 
      TABLE = "Orders" 
     }; 
    }).ToList(); 

있을 수 있습니다

당신은 또한 완전히 이런 LINQ Select 문 루프를 다시 작성할 수

MyModel model = new MyModel 
{  
    BLNC = item.BLNC, 
    VAL = item.VAL, 
    TABLE = "Orders" 
    // ... copy further properties 
}; 

당신이 뭔가를 시도 할 수있는 실제 복사본을 만들려면 귀하의 MyModel 클래스의 추가 속성을 item에서 새 인스턴스로 복사하십시오. 그리고 중첩 된 쿼리에 문제가있는 경우 balances.AsEnumerable()을 사용해야 할 수도 있습니다.

+0

많이 감사합니다. LINQ 선택은 정말 우아합니다. –

3

model = item;참조하는 복사하지한다.

model.BLNC = model.BLNC - thisQty; 업데이트 참조 즉, 원래의 객체의 값을 업데이트합니다.

toUpdate.Add(model);참조을 원래 목록의 원래 개체에 새 목록으로 다시 추가합니다.