2017-02-08 3 views
0

Я немного новичок в C#, извините, если вопрос рудиментарный.C# добавить анонимный список к напечатанному списку

У меня есть анонимный список в результате следующих действий:

var Totals = model.Payments.GroupBy(pm => pm.PaymentType) 
      .Select(t => new 
       { 
        PaymentType = t.Key, 
        Amount = t.Sum(pm => pm.Amount) 
       }); 

Возвращает итоговый анонимный список с двумя входами.

Cash 10000,00

EFT 8000,00

Теперь мне нужно добавить этот список в машинописный список в моем ViewModel. Напечатал список выглядит следующим образом

public class PaymentExportViewModel 
{ 
    public List<PaymentReportViewModel> Payments { get; set; } 
    public List<PaymentSubTotals> Subs { get; set; } 
    public DateTime FromDate { get; set; } 
    public DateTime ToDate { get; set; } 
    public String VenueName { get; set;} 
    public PaymentExportViewModel() 
    { 
     Payments = new List<PaymentReportViewModel>(); 
     Subs = new List<PaymentSubTotals>(); 
    } 
} 

public class PaymentSubTotals 
{ 
    public string Type { get; set; } 
    public decimal Amount { get; set; } 
} 

Итак, поскольку мне нужно «преобразовать» в машинописные я это

PaymentSubTotals subs = new PaymentSubTotals(); 
foreach (var t in Totals) 
{ 
    subs.Type = t.PaymentType; 
    subs.Amount = t.Amount; 
    model.Subs.Add(subs); 
} 

В результате model.subs теперь содержит 2 записи, но они одинаковы (последняя запись в моей петле) EFT 8000.00 EFT 8000.00

Что мне не хватает в модели.Subs.Add? Или где-то еще?

+2

почему проект его анонимного типа, чтобы начать с, когда вы можете просто спроецировать его в строго типизированных класса –

ответ

2

Move declation из подлодки внутри петли Еогеаспа:

foreach (var t in Totals) 
{ 
    PaymentSubTotals subs = new PaymentSubTotals(); 
    subs.Type = t.PaymentType; 
    subs.Amount = t.Amount; 
    model.Subs.Add(subs); 
} 

В своем коде вы изменяете тот же подобъект каждый раз, так что у вас есть только данные последнего переменного т, повторяющийся.

+0

Это происходит потому, что в C#, при добавлении элемента в список он передается по ссылке, а не Авторские права? Поэтому, когда вы изменяете 'subs', он изменяет элемент в списке? –

+1

@GustavoZanardini Да, это ссылочный тип - класс, поэтому в списке всего n ссылок на один и тот же объект. –

+0

Конечно, сейчас я чувствую себя немного глупо. Надеюсь, это поможет кому-то другому. – JohannC

1

Я бы порекомендовал следующий метод для добавления нового объекта PaymentSubTotals в каждый цикл.

foreach (var t in Totals) 
{ 
    model.Subs.Add(new PaymentSubTotals { 
     Type = t.PaymentType; 
     Amount = t.Amount; 
    }); 
} 
2

Почему вы не Select в свой PaymentSubTotals вместо этого.

var Totals = model.Payments.GroupBy(pm => pm.PaymentType) 
.Select(t => new PaymentSubTotals 
{ 
Type = t.Key, 
Amount = t.Sum(pm => pm.Amount) 
}); 
Смежные вопросы