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:4 miesiące
  • 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:ponad 13 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 5 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2156
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 3 godziny
  • Postów:5108
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:4 miesiące
  • 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.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)