Sumowanie elementów listy

Sumowanie elementów listy
K9
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:141
0

Cześć, mam zbiór danych (wrzuciłem jako załącznik). Są to dwie serie danych. Chciałbym je zsumować (niezależnie czy będą to dwie serie czy n serii zawsze chciałbym zsumować wartości 'cost' po dacie, tak żeby w rezultacie mieć wynikowo tabelę, która będzie miała daty oraz zsumowane wartości cost). Między innymi problem polega na tym, że serie mogą być różnych długości, tak jak w załączniku.
Generalnie na ten moment w C# wrzucam sobie te serie danych do listy jako oddzielne elementy i teraz chciałbym je posumować po dacie. Jak mogę to zrobić?

Dodam, że głównym problemem jest to, że chciałbym, żeby te elementy z list się przeplatały tzn jesli w jednej z nich nie ma danej z np godziny 15, a w drugiej jest, to żeby wynikowo ta 15 mimo wszystko była. Dlatego chyba tutaj sumowanie z użyciem linq po kluczu (jako dacie) nie spełni oczekiwań?

edytowany 1x, ostatnio: kamilos95
BC
chcesz dodać cost dla tych samych time a jeżeli nie ma danej daty w jednej tabelce to użyć tylko wartości z drugiej; może po prostu wyciągnij time z pierwszej i drugiej tabeli do powiedzmy listy, pobierz unikalne wartości a później pobieraj z obu list wartość dla klucza time czymś typu FirstOrDefault jak nie znajdzie to zwróci zero, sumuj i tyle, można o zrobić lepiej np. wrzucając dane z list do słowników, ale to jak tam już potrzebujesz
neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 7 godzin
  • Lokalizacja:Kraków
  • Postów:1114
2

Ja bym posortował obie listy po czasie, a potem je scalił tak jak to robi się w algorytmie sortowania przez scalanie. Spoiler alert, w takim sam sposób relacyjne bazy danych robią joina na posortowanych kolumnach, operator: mergejoin. A mówią że znajomość algorytmów sortowania się nie przydaje :D


edytowany 1x, ostatnio: neves
kzkzg
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 godzin
  • Postów:926
0

O ile dobrze Cię zrozumiałem

Kopiuj
 class Data
    {
        public DateTime Date { get; set; }
        public double Cost { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {

            var l1 = new List<Data>
            {
                new Data{ Date= new DateTime(2011,1,1), Cost= 200},
                new Data{ Date= new DateTime(2011,1,2), Cost= 201},
                new Data{ Date= new DateTime(2011,1,3), Cost= 202},
                new Data{ Date= new DateTime(2011,1,4), Cost= 203},
                new Data{ Date= new DateTime(2011,1,5), Cost= 204},
                new Data{ Date= new DateTime(2011,1,6), Cost= 206},

            };
            var l2 = new List<Data>
            {
                new Data{ Date= new DateTime(2011,1,1), Cost= 2110},
                new Data{ Date= new DateTime(2011,1,2), Cost= 20421},
                new Data{ Date= new DateTime(2011,1,3), Cost= 25303},
                new Data{ Date= new DateTime(2011,1,7), Cost= 20425},
                new Data{ Date= new DateTime(2011,1,8), Cost= 20536},

            };

            var listOfList = new List<List<Data>> { l1, l2 };

            var result=listOfList.SelectMany(o => o).GroupBy(o => o.Date).Select(o => new Data { Date = o.Key, Cost = o.Sum(o => o.Cost) });
            

        }

Keep calm and blame frontend.
Tell your cat I said pspsps.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.