• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c# - wczytywanie danych jako obiekty gdy poszczególne cechy same są obiektami

Object Storage Arubacloud
0 głosów
77 wizyt
pytanie zadane 23 marca 2023 w C# przez Poeta Doctus Użytkownik (740 p.)
Witajcie,

mam pytanie o wczytywanie danych w c#. Mianowicie mam 4 zestawy danych. Każdy reprezentowany jest przez listę obiektów (różnych). Wczytanie tego byłoby proste dla mnie gdyby nie fakt, że jedne z kolumn danych to referencje do innych obiektów. Generalnie jest łącznie 5 referencji. Np Klasa Game ma pole List<User> Authors gdzie autorzy to referencje do obiektu typu User. Jest to podawane w danych jako lista indeksów np [1,2,4] - czyli gra ma autorów o indeksach 1,2 i 4. Jakkolwiek tutaj chcemy te indeksy rozumieć. Zakładam, że te indeksy to indeksy obiektów User w liście. Tylko, że obiekty User mają pole o nazwie Games typu List<Game> więc one potrzebowały by najpierw stworzenia listy gier a nie graczy. No i tutaj jest mój problem. Nie wiem jak poradzić sobie z wczytywaniem tych referencji. Będę wdzięczny za wszelką pomoc.

1 odpowiedź

0 głosów
odpowiedź 23 marca 2023 przez tangarr Mędrzec (154,860 p.)
Dodaj sobie pole zawierające listę indeksów a listę referencji zostaw pustą. Dopiero po wczytaniu wszystkich elementów wygeneruj listy referencji.
komentarz 23 marca 2023 przez Poeta Doctus Użytkownik (740 p.)
Tylko to doprowadza do takiej kuriozalnej moim zdaniem sytuacji, że muszę iterować po kilka razy w różnych kombinacjach, zależnych od konkretnych referencji. Nie ma na to jakiegoś eleganckiego sposoby?
komentarz 24 marca 2023 przez tangarr Mędrzec (154,860 p.)
Dlaczego musisz iterować po kilka razy?

Wrzuć kawałek kodu to ci pokażę jak bym go zmodyfikował.
komentarz 24 marca 2023 przez Poeta Doctus Użytkownik (740 p.)
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Text.RegularExpressions;

namespace po_proj
{
    class Program
    {
        static void Main(string[] args)
        {
            // Define path to files
            string prefixPath = @"/Users/ben/Desktop/";
            string gamePath = prefixPath + "games.txt";
            string userPath = prefixPath + "users.txt";
            string modsPath = prefixPath + "mods.txt";
            string reviewsPath = prefixPath + "reviews.txt";

            // Create empty list of Game objects
            List<string> lines = new List<string>();
            List<Game> games = new List<Game>();
            List<User> users = new List<User>();
            List<Mod> mods = new List<Mod>();
            List<Review> reviews = new List<Review>();

            // Read data for games
            lines = File.ReadAllLines(gamePath).ToList();
            foreach (string line in lines)
            {
                string[] items = line.Split(", ");
                int idx = Int32.Parse(items[0].Split(". ")[0]);
                string name = items[0].Split(". ")[1];
                Game game = new Game(idx, name, items[1], items[2], items[3], items[4], items[5]);
                games.Add(game);
            }

            // Read data for users
            lines = File.ReadAllLines(userPath).ToList();
            foreach (string line in lines)
            {
                string[] items = line.Split(", ");
                int idx = Int32.Parse(items[0].Split(". ")[0]);
             
                string name = items[0].Split(". ")[1];
                
                User user = new User(idx, name, items[1]);
                users.Add(user);
            }

            // Read data for reviews
            lines = File.ReadAllLines(reviewsPath).ToList();
            foreach (string line in lines)
            {
                string[] items = line.Split(",  ");
                int idx = Int32.Parse(items[0].Split(".  ")[0]);
                string text = items[0].Split(".  ")[1];
                int rating = Int32.Parse(items[1]);
                Review review = new Review(idx, text, rating, items[2]);
                reviews.Add(review);
            }
                

            // Read data for mods
            lines = File.ReadAllLines(modsPath).ToList();
            foreach (string line in lines)
            {
                
                string[] items = line.Split(", ");
                int idx = Int32.Parse(items[0].Split(". ")[0]);
                string name = items[0].Split(". ")[1];
                Mod mod = new Mod(idx, name, items[1], items[2], items[3]);
                mods.Add(mod);
            }

            // Update References
            foreach (Game game in games)
            {
                game.addAuthors(users);
                game.addReviews(reviews);
                game.addMods(mods);
            }
            foreach (Review review in reviews)
            {
                review.addAuthors(users);
            }
            foreach (User user in users)
            {
                user.addGames(games);
            }
            foreach (Mod mod in mods)
            {
                mod.addAuthors(users);
                mod.addCompatibility(mods);
            }
           
            // Show Data
            foreach (var mod in mods)
            {
                Console.WriteLine(mod.Name);
                Console.WriteLine(mod.Description);
                foreach(var author in mod.Authors)
                {
                    Console.WriteLine(author.Name);
                }
                foreach (var compMod in mod.Compatibility)
                {
                    Console.WriteLine(compMod.Name);
                }
                Console.WriteLine("-------");
            }
        


            GameR4 gameR4 = new GameR4(5, "Bouwlajasz");
            foreach(var key in gameR4.Name.Keys)
            {
                Console.WriteLine(key +" --- " + gameR4.Name[key]);
            }

            
            Console.ReadLine();
        }

        
    }
}

Generalnie zrobiłem to w taki sposób, choć sugestia prowadzącego była taka aby znaleźć sposób bez zbędnego tworzenia list indeksów itp, niemniej nie widzę możliwości jak by to zrobić

 

*Co do kodu to najpierw tworze list obiektów bez referencji a potem je uzupełniał metodami.

Podobne pytania

+1 głos
3 odpowiedzi 316 wizyt
pytanie zadane 15 sierpnia 2019 w C# przez luna22 Obywatel (1,420 p.)
0 głosów
1 odpowiedź 198 wizyt
0 głosów
0 odpowiedzi 89 wizyt

92,568 zapytań

141,422 odpowiedzi

319,629 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...