2017-12-07 12 views
0

나는 여기서 몇 가지 해답을 살펴 보았지만 내가 원하는 것을 정확히 찾을 수 없었다. 그래서 나는 그 질문을 게시하기로 결정했다 :LINQ를 사용하여 목록에있는 클래스에서 두 개의 필드를 추가하는 방법?

나는 클래스 A의 물체를 가지고 있는데 나는 List<A>을 가지고있다.

public decimal Discount { get; set; } 
    public decimal Deposit { get; set; } 
    public decimal Total { get; set; } 

나는이 목록에있는 클래스의 번호를 가지고 :

클래스는 다음과 같이 정의되어있다.

I 할인 및 보증금의 계산 된 총 : 나는 각 클래스의 합계 (예금, 할인)를 계산하고 Total 필드에 결과를 할당해야합니다, 그래서 Total을 얻을 수있을 것입니다 이제

var DepositTotal = myList.Sum(x => x.Deposit); 
var DiscountTotal = myList.Sum(x => x.Deposit); 

나중에 각 수업마다

어떻게하면됩니까?

+1

"각 클래스의 합계 (예금, 할인) 계산"이란 무엇을 의미합니까? 당신이 "클래스"를 말할 때 대신 * 인스턴스 *를 의미합니까? 각 인스턴스에 대해'this.Total = this.Deposit + this.Discount'를 설정하겠습니까? '예금'과'할인'에 대한 세터에서 그렇게하거나,'총합'을'public double Total => Discount + Deposit;으로 재 작성하십시오. –

+0

네, 그게 제가 지금하고있는 일입니다. Thx – gene

+0

방금 ​​완전히 다른 것을 제안하기 위해 내 의견을 편집했습니다. –

답변

2

코드 독자가 코드를 읽지 않으므로 LINQ 쿼리의 항목을 수정하면 안됩니다.

불행하게도 당신은 쉽게 너무도 선택으로 그렇게 할 수 있습니다

list.Select(x => {x.Total = x.Discount + x.Deposit; return x;}); 

참고 : 현재하고있는

public decimal Total => Discount + Deposit; 
+0

그것은 실제로 불행합니다. –

+1

@EdPlunkett sort-of는 게시물에서 업데이트 된 의견을 통합했습니다 (또한 업데이트를보기 전에 그것을 수행했습니다 :)) –

0

방법 : 더 나은 솔루션 재산 Total 대신 필드를 계산 한 것으로 될 수있다 할인 및 입금에서 세터를 사용하여 올바른하지만 그때 당신은 너무 비공개에 대한 세터를 만들어야합니다.

쿼리 내에서 목록의 A 개체를 변형 할 수는 없지만 원본 목록에서 쿼리 결과를 사용하여이를 덮어 써서 목록을 업데이트 할 수는 있습니다. 클래스 A의 생성자에 분명하지만, 다음과 같은 것이 아닙니다 -

여전히 총 ​​할인 및 예금의 값에 전적으로 의존하는 경우
myList = myList.Select(a=>new A(Discount =a.Discount, Deposit=a.Deposit, Total=a.Discount+a.Deposit)).ToList(); 

- 명명은 수업이 완전히 내부를 만드는 나타 내기 위해 표시되는 - 캡슐화 - 더 나은.