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

C# usuwanie z listy objektów i dodawanie

Object Storage Arubacloud
0 głosów
2,927 wizyt
pytanie zadane 16 kwietnia 2023 w C# przez Whyyy Nowicjusz (240 p.)

Witam mam malutki problem mianowicie tworze 2 klasy

-przedmioty(służy tylko do stworzenia przedmiotu i jego wagi)

-ekwipunek(obsługuje listę (dodaje, sprawdza czy nie przekroczono limitu pojemności)

Problem pojawia sie kiedy chciałem oddać obiekt klasy przedmiot do listy klasy ekwipunek, użyłem takiej metody ale mam wrazenie ze duplikuje obiekt  i marnuje to zasoby (chciałem zrobić ekwipuneks.add(przedmiot)) ale to nie chciało działać (przeładowanie add o 2 argumenty) dlatego skończyło tak jak niżej.

public void dodaj(przedmiot przedmiot)
        {
            if (czy_moge_dodac() == true)
            {
                ekwipuneks.Add(new ekwipunek(nazwa=przedmiot.nazwa,waga=przedmiot.waga));
                akt_obciazenie += przedmiot.waga;

            }
            else
            {
                Console.WriteLine("Za mało miejsca");
            }
        }

Ważniejszy problem pojawia sie jak próbuje usunąć obiekt z listy i nie moge sobie z tym poradzić

public void usun(przedmiot p)
        {

            ekwipuneks.Remove(new ekwipunek(nazwa=p.nazwa, waga=p.waga));// kompilator akceptuje alle nie usuwa z listy
            ekwipuneks.Remove(p.nazwa,p.waga); //kompilator wywala przeciążenie remove nie pobiera 2 argumentow
            
        }

Próbowałem już szukania po indexie ale wtedy występuje błąd z konwersja z stringa na eq.przedmiot (kod pisany w klasie ekwipunek)'

 

Mam nadzieje że przedstawiłem to jakoś zrozumiale. Prosze o pomoc może jakieś linki gdzie wytłumaczone będzie dodawanie obiektów z klas do listy w innej klasie (tak przeszukiwałem juz googla nic nie znalazłem co by mi mogło pomóc).

komentarz 16 kwietnia 2023 przez adrian17 Ekspert (344,860 p.)
edycja 17 kwietnia 2023 przez adrian17
Czym się różni `ekwipunek` od `przedmiot`u? Pokaż te wszystkie klasy.

W każdym razie wygląda mega dziwnie, że tworzysz obiekt żeby cokolwiek usunąć.

BTW, nazywaj klasy i metody poprawnie z wielkiej litery, z pewnością VS na Ciebie krzyczy przez to.
1
komentarz 17 kwietnia 2023 przez VBService Ekspert (252,740 p.)
edycja 17 kwietnia 2023 przez VBService

@Whyyy, Spróbuj coś na wzór

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static List<Ekwipunek> listaEkwipunek = new List<Ekwipunek>();

        static void Main(string[] args)
        {
            listaEkwipunek.Add(new Ekwipunek("Miecz", 2.5));
            listaEkwipunek.Add(new Ekwipunek("Tarcza", 3.5));
            listaEkwipunek.Add(new Ekwipunek("Eliksir", 0.5));

            foreach (Ekwipunek ekwipunek in listaEkwipunek)
                Console.WriteLine("Nazwa: " + ekwipunek.Nazwa + ", Waga: " + ekwipunek.Waga);

            Console.WriteLine(new string('-', 30));

            // Usuwanie z listy po nazwie - Nazwa
            string usunNazwa = "Tarcza";
            Ekwipunek usunLista = listaEkwipunek.Find(i => i.Nazwa == usunNazwa);
            if (usunLista != null)
                listaEkwipunek.Remove(usunLista);

            foreach (Ekwipunek ekwipunek in listaEkwipunek)
                Console.WriteLine("Nazwa: " + ekwipunek.Nazwa + ", Waga: " + ekwipunek.Waga);

            Console.ReadKey();
        }
    }

    public class Ekwipunek
    {
        public string Nazwa { get; set; }
        public double Waga { get; set; }

        public Ekwipunek(string nazwa, double waga)
        {
            Nazwa = nazwa;
            Waga = waga;
        }
    }
}

 

komentarz 17 kwietnia 2023 przez Whyyy Nowicjusz (240 p.)
edycja 17 kwietnia 2023 przez Whyyy

@adrian17, 

Ekwipunek miał być klasa zawierającą konkretny ekwipunek i przedmioty w nim zawarte.
Przedmioty miały natomiast być osobne żeby bez tworzenia nowego przedmiotu można było go już dodać do istniejącego ekwipunku.

 

public  class przedmiot
    {
        public string nazwa;
        public int waga;

        public przedmiot(string nazwa, int waga)
        {
            this.nazwa = nazwa;
            this.waga = waga;
        }
        //enum przedmioty_domyslne
        //{
        //    miecz = 100,
        //    luk = 20,
        //    strzała = 1

        //}

    }

ekwipunek z zaimplementowanym kodem od @VBService faktycznie już działa usuwanie.

enum przedmioty_domyslne
    {
        miecz = 100,
        luk = 20,
        strzała = 1

    }
    internal class ekwipunek
    {
        List<ekwipunek> ekwipuneks = new List<ekwipunek>();
        int akt_obciazenie, max_obciazenie,waga;
        string nazwa;



        public ekwipunek(int max_obciazenie)
        {
            List<ekwipunek> ekwipuneks = new List<ekwipunek>();
            this.max_obciazenie = max_obciazenie;
            this.akt_obciazenie = 0;
        }
        private ekwipunek(string nazwa,int waga)
        {
            this.nazwa = nazwa;
            this.waga = waga;
        }

        public ekwipunek()
        {
        }

        public void dodaj(przedmiot przedmiot)
        {
            if (czy_moge_dodac() == true)
            {
                ekwipuneks.Add(new ekwipunek(nazwa=przedmiot.nazwa,waga=przedmiot.waga));
                akt_obciazenie += przedmiot.waga;

            }
            else
            {
                Console.WriteLine("Za mało miejsca");
            }
        }
        internal void dodaj(przedmioty_domyslne przedmioty_Domyslne)
        {
            if (czy_moge_dodac() == true)
            {
                ekwipuneks.Add(new ekwipunek(nazwa = przedmioty_Domyslne.ToString() , waga = (int)przedmioty_Domyslne));
                akt_obciazenie += (int)przedmioty_Domyslne;

            }
            else
            {
                Console.WriteLine("Za mało miejsca");
            }
        }
        public void usun(przedmiot p)
        {

            string usunNazwa = p.nazwa;
            ekwipunek usunLista = ekwipuneks.Find(i => i.nazwa == usunNazwa);


            if (usunLista != null)
                ekwipuneks.Remove(usunLista);

            foreach (ekwipunek ekwipunek in ekwipuneks)
                Console.WriteLine("Nazwa: " + ekwipunek.nazwa + ", Waga: " + ekwipunek.waga);

            //ekwipuneks.Remove(new ekwipunek(nazwa=p.nazwa, waga=p.waga));

            ////FindIndex(ekwipunek<ekwipuneks>);

            ////ekwipuneks.RemoveAll(przedmiot.nazwa,przedmiot.waga);
            //ekwipuneks.Remove(p.nazwa, p.waga);

            //ekwipuneks.Remove(new ekwipunek(nazwa = przedmiot.nazwa, waga = przedmiot.waga));

            //ekwipuneks.Remove(nazwa=przedmiot.nazwa,waga=przedmiot.waga);

            //ekwipuneks.Remove(przedmiot.nazwa,przedmiot.waga);

        }
        
        private bool czy_moge_dodac()
        {
            if (akt_obciazenie+waga<=max_obciazenie)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public void wyswietl_eq()
        {
            foreach (var item in ekwipuneks)
            {
                Console.WriteLine(item.nazwa+" "+item.waga);
            }
            Console.WriteLine("Ekwipunek nr "+"\nAktualne obciazenie "+akt_obciazenie);
        }

       
    }

 

Chciałem popróbować tworzenie list i jakoś optymalnie zarządzić pamięcią ale widze że to tak mi wychodzi słabo. Jeszcze fajnie by było zaimplementować kompletne usuwanie przedmiotów z pamięci komputera żeby go nie zasypywać nieużywanymi obiektami. No i na końcu planuje utworzenie klasy która będzie odpowiadać za interfejs użytkownika postawionym na case.
 

Jak już przy okazji to zapytam bo pewnie jak widać dopiero zaczynam gdzie moge znaleźć jakieś bardziej obszerne zadania właśnie w stylu tego ekwipunku żeby trenować jak co gdzie. 

PS. Dzieki za pomoc! Wezmę do serduszka rade z wielkością liter (chociaż VS nie krzyczy)

komentarz 17 kwietnia 2023 przez Whyyy Nowicjusz (240 p.)
Dzieki już zaimplementowałem i działa.

Jedno pytanko tak dodatkowo co miałbym zrobić jesli pojawiły by sie 2 przedmioty z tą samą nazwą (usunęło by pewnie 1 napotkany) przedmioty powinny zacząć dostawać jakieś unikalne id o którym użytkownik by nie wiedział?  Tylko wtedy musiałby podać nazwę i wagę (jedyne znane mu wartości) a program po tym musiałby odszukać id tego przedmiotu i po tym go usunąć. To ma sens czy za dużo rozmyślania?
komentarz 18 kwietnia 2023 przez jankustosz1 Nałogowiec (35,880 p.)
Moim zdaniem nie powinieneś wyszukiwać przedmiotu po nazwie. Powinieneś do metody od usuwania przekazać obiekt który chcesz z ekwipunku usunąć i znaleźć go w liście poprzez porównanie referencji.

Zazwyczaj w grach ekwipunek ma elementy na jakiś pozycjach. Więc przydałoby się, aby każdy item miał zapisaną swoją pozycję. Wtedy przydałaby Ci się jeszcze funkcja która pobiera element z danej pozycji.
komentarz 18 kwietnia 2023 przez adrian17 Ekspert (344,860 p.)
edycja 18 kwietnia 2023 przez adrian17

Na moje oko to ten projekt klas nie ma zbytnio sensu.

    internal class ekwipunek
    {
        List<ekwipunek> ekwipuneks = new List<ekwipunek>();

Czemu Ekwipunek ma w sobie listę Ekwipunków (a każdy może mieć _swoją_ listę Ekwipunków)? Czemu ekwipunek ma nazwę?

To nie powinna być raczej lista przedmiotów albo lista par przedmiot+liczba?

komentarz 19 kwietnia 2023 przez Whyyy Nowicjusz (240 p.)

@jankustosz1, 

Chciałem coś w tym stylu stworzyć ale problemem była .remove która za żadne skarby jakbym nie napisał nie chciała mi usuwać elementów jak była podana nazwa i waga, wyskakuje błąd że za duzo argumentów i remove nie pobiera 2.

Nie mam kompletnie pomysłu na to co musiałbym napisać żeby to działało, też dlatego tu sie o to pytam.

komentarz 19 kwietnia 2023 przez Whyyy Nowicjusz (240 p.)
Oj nie zauważyłem tego każdy ekwipunek miał mieć własną listę tylko. Dzieki będę jakoś przebudowywał. Tak sie zastanawiam bardziej opłaca mi sie trzymać listę z którymi jak widać sobie nie radze czy może zrobić tablice 3x1 gdzie np 1 trzymałby index, 2 nazwę, 3 wagę. Tylko czy to nie było by bardzo zasobożerne. Też w sumie chciałbym potrenować listy no ale jakoś nie rozumiem jak one działają i jak działają elementy w nich zapisane kiedy jest wiecej argumentów jak to przypisać.  Używam regułki:

ekwipuneks.Add(new ekwipunek(nazwa=przedmiot.nazwa,waga=przedmiot.waga));

 

tylko nie wiem jak to lista traktuje i przechowuje.
1
komentarz 19 kwietnia 2023 przez adrian17 Ekspert (344,860 p.)

Tak sie zastanawiam bardziej opłaca mi sie trzymać listę z którymi jak widać sobie nie radze czy może zrobić tablice 3x1 gdzie np 1 trzymałby index, 2 nazwę, 3 wagę

Strasznie kombinujesz.

Czemu ekwipunek nie zawiera po prostu listy przedmiotów? Każdy przedmiot już ma swoją nazwę i wagę.

komentarz 21 kwietnia 2023 przez Whyyy Nowicjusz (240 p.)
Wiem dlatego zapytałem czy to nie będzie fajną opcja ale fakt masz razie przekombinowane.

1 odpowiedź

0 głosów
odpowiedź 21 kwietnia 2023 przez Whyyy Nowicjusz (240 p.)
Dziękuje wszystkim za pomoc biorę rady do serca i spróbuje coś z tego uzyskać.

 

Temat do zamknięcia.

Podobne pytania

0 głosów
1 odpowiedź 308 wizyt
pytanie zadane 13 września 2022 w Python przez Ziom Początkujący (430 p.)
+1 głos
1 odpowiedź 244 wizyt
pytanie zadane 3 listopada 2021 w Python przez jakubjordanek Obywatel (1,320 p.)
0 głosów
1 odpowiedź 2,026 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...