Dictionary<> i obiekty

Dictionary<> i obiekty
GironX
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:59
0

Z tego co się orientuję, to w Dictionary<>, można zainicjalizować na zasadzie <object1, object2>. Czy ktoś się orientuje jak można dodać w takiej konstrukcji object1, a portem przyporządkować object2. Coś na zasadzie:

Kopiuj
object1. nazwisko
    object2.title1
    object2.title2
    object3.title3

Co bym nie wymyślił to się sypie.

edytowany 1x, ostatnio: GironX
ZK
Nie bardzo rozumiem co chcesz zrobić . Wstaw cały kod programu .
GironX
Cały kod jest tutaj, ale nie ma on nic wspólnego z bieżącym problemem. Generalnie mam za dużo powtórzeń w klasach i dlatego je redukuję: https://github.com/igorzeler/HandyBook_Room/tree/master/Handy_BookRoom
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
0

O takie coś ci chodzi ?
:

Kopiuj
using System;
using System.Collections.Generic;


namespace ConsoleApp80
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, string> slownik = new Dictionary<string, string>() { ["a"] = "b", ["c"] = "d"};

            Console.WriteLine(slownik["a"]);
            Console.WriteLine(slownik["c"]);
        }
    }
}

Zobacz pozostałe 6 komentarzy
ZK
Prosiłem cie żebyś pokazał kod , który powoduje ci błąd . Dlaczego tego nie zrobiłeś ?
GironX
Bo widziałem jakość twojego i raczej nie jesteś w stanie mi pomóc.
ZK
Nie odwracaj kota ogonem tylko pokaż .
ZK
Ile lat zajmujesz się programowaniem ?
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
3

https://stackoverflow.com/questions/634826/using-the-field-of-an-object-as-a-generic-dictionary-key

tl;dr

musisz przeciązyć

Kopiuj
public override int GetHashCode();

public override bool Equals(object obj);
    
public bool Equals(TwojTyp obj);
edytowany 1x, ostatnio: fasadin
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
1

Jeśli masz element o tym samym kluczu w Dictionary to się wysypie.

Kopiuj
    class Obj1
    {
        public string lastname { get; set; }
    }

    class Obj2
    {
        public string title1 { get; set; }
        public string title2 { get; set; }
        public string title3 { get; set; }
    }
Kopiuj
Dictionary<Obj1, Obj2> dic = new Dictionary<Obj1, Obj2>();

Obj1 obj = new Obj1();
obj.lastname = "Kowalski";
Obj1 obj1 = new Obj1();
obj.lastname = "Kowalski";

Obj2 obj2 = new Obj2();
obj2.title1 = "tytuł";
obj2.title2 = "tytuł2";
obj2.title3 = "tytuł3";

dic.Add(obj, obj2);
dic.Add(obj1, obj2);
dic.Add(obj, obj2); //TUTAJ RZUCI EXCEPTION

Jest możliwe, że dodajesz ten sam obiekt do słownika?

GironX
Chyba właśnie tak robiłem, a celem nie było tego. pokażę to w kodzie na końcu.
AD
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Postów:27
0
AdamWox napisał(a):

Jeśli masz element o tym samym kluczu w Dictionary to się wysypie.

Kopiuj
    class Obj1
    {
        public string lastname { get; set; }
    }

    class Obj2
    {
        public string title1 { get; set; }
        public string title2 { get; set; }
        public string title3 { get; set; }
    }
Kopiuj
Dictionary<Obj1, Obj2> dic = new Dictionary<Obj1, Obj2>();

Obj1 obj = new Obj1();
obj.lastname = "Kowalski";
Obj1 obj1 = new Obj1();
obj.lastname = "Kowalski";

Obj2 obj2 = new Obj2();
obj2.title1 = "tytuł";
obj2.title2 = "tytuł2";
obj2.title3 = "tytuł3";

dic.Add(obj, obj2);
dic.Add(obj1, obj2);
dic.Add(obj, obj2); //TUTAJ RZUCI EXCEPTION

Jest możliwe, że dodajesz ten sam obiekt do słownika?
Masz błędy w przykładzie, chyba powinno być: obj1.lastname = "Kowalski" ;

AdamWox
Zgadza się. Błagam o wybaczenie
GironX
Rozumiem, że jeśli bym porównał np Id użytkownika (obj1) i miał takie samo, to zamiast tworzyć nowego użytkownika , wystarczy dodać do listy. czy w ten sposób uniknę wysypu programu?
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około godziny
  • Postów:5133
1

Dictionary<Obj1, List<Obj2>>

Dictionary<string, List<string>>

A tak?

edytowany 1x, ostatnio: WeiXiao
GironX
Dokładnie pomyślałem o tej pierwszej wersji, wygląda po prostu, że za bardzo przekombinowałem w kodzie.
GironX
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:59
0

Potrzebuję dokładnie dodając nowego użytkownika pobrać jego id i przypisać listę książek. To powinno wyeliminować powtórzenia ale coś nie pykło a dodaniem użytkownika, i przebudowuję ten słownik. jak widać klasa jest rozgrzebana, więc wszystko się jeszcze może zmienić..

Kopiuj
class RemoteUser : User, IVerifiable
    {
        public RemoteUser(string username, string email, string mobilenumber) : base(username, email, mobilenumber)
        {
        }

        Dictionary<User, List<Book>> remoteUser = new Dictionary<User, List<Book>>();

        
        
    #region Methods
        /// <summary>
        /// Metoda obsługująca utworzenie użytkownika
        /// </summary>
        /// <param name="username">Nazwa</param>
        /// <param name="email">E-mail</param>

        public User CreateUser(string username, string email, string mobilenumber)
        {
            username = Console.ReadLine();
            email = Console.ReadLine();
            mobilenumber = Console.ReadLine();

            User remUsr = new User(username, email, mobilenumber);
            return remUsr;
        }

        /// <summary>
        /// Metoda obsługująca zapisanie użytkownika
        /// </summary>
        /// <param name="username">Nazwa</param>
        /// <param name="email">E-mail</param>
        override public void SaveUser(string username, string useremail, string mobilenumber)
        {
            //Not implemented yet
        }

        /// <summary>
        /// Metoda obsługująca weryfikację nowego użytkownika
        /// </summary>
        /// <param name="username">Nazwa</param>
        /// <param name="email">E-mail</param>
        /// <param name="mobilenumber">Numer telefonu komórkowego</param>
        public void UserVerification(string username, string email, string mobilenumber)
        {
            //Not implemented yet
        }
        #endregion

        

    }
Kopiuj
class  User
    {
        /// <summary>
        /// Klasa bazowa obsługujaca użytkowników
        /// </summary>
        /// 
        private string _username;
        private string _useremail;
        private string _mobilenumber;
        private static int counter = 0;

        private int UserId { get; set;  }


        public User(string username, string useremail, string mobilenumber)
        {
            counter++;
            UserId = counter;
            _username = username;
            _useremail = useremail;
            _mobilenumber = mobilenumber;
        }


        #region Methods

        /// <summary>
        /// Metoda obsługująca zapisanie użytkownika
        /// </summary>
        /// <param name="username">Nazwa</param>
        /// <param name="email">E-mail</param>
        virtual public void SaveUser(string username, string email, string mobilenumber)
        {
            //Not implemented yet
        }
        #endregion
        #region Properties
        public string UserName
        {
            get
            { return _username; }
            set
            {
                if (!String.IsNullOrEmpty(value))
                {
                    _username = value;
                }
            }
        }
        public string UserEmail
        {
            get
            { return _useremail; }
            set
            {
                if (!String.IsNullOrEmpty(value))
                {
                    _useremail = value;
                }
            }
        }
        public string MobileNumber
        {
            get
            { return _mobilenumber; }
            set
            {
                if (!String.IsNullOrEmpty(value))
                {
                    _mobilenumber = value;
                }
            }
        }
        #endregion

    }
Kopiuj
class Book
    {
        private string _title;
        private string _author;
        public static int counter = 0;
        public static int BookId { get; set; }

        
        public Book(string title, string author)
        {
            counter++;
            BookId = counter;
            _title = title;
            _author = author;
        }

        public string Title
        {
            get
            { return _title; }
            set
            {
                if(!String.IsNullOrEmpty(value))
                {
                    _title = value;
                }
            }
        }
        public string Author
        {
            get
            { return _author; }
            set
            {
                if(!String.IsNullOrEmpty(value))
                {
                    _author = value;
                }
            }
        }
        
        public static DateTime DateAddToLibrary(DateTime date)
        {
            return date;
        }
    }
}
edytowany 4x, ostatnio: GironX
Zobacz pozostałe 9 komentarzy
WeiXiao
@GironX: Zawsze możesz też zrobić Dictionary<int, List<Book>> lub Dictionary<Guid, List<Book>>, gdzie int/guid są ID.
GironX
@WeiXiao na chwile obecną, wystarczyło utworzyć domyślny konstruktor z licznikiem w klasie Book i User, bardziej zaawansowane rzeczy jak odczyt z pliku czy bazy danych , jak na razie zostawiam na później. W ten sposób mogę dodawać do listy tylko ID. Ale patrząc na ta klasę, wygląda na to, że będę musiał przenieść ta funkcjonalność do innej lub nowej.
GironX
@WeiXiao to też ciekawe rozwiązanie. Będę kombinował. Dzięki.
GironX
@WeiXiao: Pisząc o Guid, miałeś na myśli metodę Guid.NewGuid ?
WeiXiao
@GironX: Guid.NewGuid() to metoda do tworzenia Guida, a Guida to typ :P
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
0

Tak jak ty to zrobiłeś to jedynie tak się da zrobić . Źle podszedłeś do tematu .

Kopiuj
Dictionary<User, List<Book>> remoteUser = new Dictionary<User, List<Book>>();
            User user1 = new User("Jan", "jan.kowalski@gmail.com", "504480007");

            remoteUser.Add(user1 , new List<Book>() { new Book("Potp", "Henryk Sienkiewicz") });


            Console.WriteLine( remoteUser[user1][0].Author);
            Console.WriteLine(remoteUser[user1][0].Title);
edytowany 1x, ostatnio: Zimny Krawiec
Zobacz pozostały 1 komentarz
ZK
Teraz to ja nie wiem z czym ty dokładnie miałeś problem
GironX
Zimny Krawiec: Ale ja już napisałem, że przekombinowałem ze składnią. :D Wyjaśnił mi to post WeiXiao, niepotrzebnie dałem dwie listy. W efekcie to dawało powtórzenia pierwszego elementu słownika i wywalało program. Mój błąd zapomniałem zaznaczyć, że to rozwiązało mój problem. A to że potem dopytuję się o szczegóły, to chyba moje prawo. :D Kod który tu dałem , już był po poprawkach. A że klasa jeszcze nie jest skończona, to zupełnie inna sprawa.
ZK
Jak długo zajmujesz się programowaniem w ogóle a jak długo w C# ? Na ile oceniasz swoją znajomość C# a na ile znajomość bibliotek NET ?
GironX
Poszło na priwa. nie ma co zaśmiecać tematu.
GironX
Inna rzecz , że ja lubię pracować modularnie. to znaczy zbieram klocki programu, gdy już mam pewne elementy składanki, wtedy zbieram to do kupy. Jeśli Ściągałeś projekt z GitHuba, to on ma już pewną funkcjonalność. Niewielką, ale działa.

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.