Odwołanie się do konkretnych obiektów z List<>

0

Witam

Problem może być trywialny ale ja się zamotałem i jakoś nie mogę znaleźć prostego rozwiązania.

Mam klasę Edytor. W niej jeden Obiekt klasy Mapa. A w mapie mam listę z obiektami klasy np. Szyld.

W dużym uproszczeniu wygląda to mniej więcej tak :

static class Edytor
{
   Mapa map;
}

class Mapa
{
   List<Szyld> szyldy;
}

class Szyld
{
    uint ID;
    string tekst;
    // itp...
}

I teraz w klasie Edytor w jakieś metodzie tworzę sobie np. temp_Szyld i ustawiam go na mapie i dodaje do listy.

void dodajObiekt()
{
    Szyld tmp_Szyld = new Szyld("test");
    map.szyldy.Add(tmp_Szyld);
    map.typ[kursorX,kursorY] = szyld;
}

Ale po tym wszystkim mam problem z odwołaniem się do tego obiektu. Skąd mam wiedzieć jaki pod jakim indeksem jest konkretny szyld ?

void Info()
{
    if (map.typ[kurosr.X,kursor.Y] == szyld)
    {
         map.boards[ ?? ].tekst;
    }

}

W sumie nic ciekawego nie wymyśliłem, poza np. przeszukiwaniem całej listy i sprawdzanie czy dany szyld stoi na X,Y ale pewnie to jest głupota. Albo dodaniem dynamicznego ID które zawsze równa się indeksowi z List.

1

zamiast listy użyj słownika który będzie tłumaczył nazwę szyldu na szyld:

Dictionary<String, Szyld>

// w sumie to tylko rzuciłem okiem na post więc to może nie jest nawet odpowiedź ;D

jeśli masz warunek:

if (map.typ[kurosr.X,kursor.Y] == szyld)

to w miejscu szyld już masz ten swój szyld to po co go jeszcze szukasz w map.boards? Wystarczy odwołanie do szyld.tekst

1

Po co trzymasz szyldy w osobnej liście?
Utrudniasz sobie tę robotę, ponieważ aktualnie musiałbyś zmienić to na coś w rodzaju:

map.typ[kursorX,kursorY] = szyld;
map.map_szyldy[kursorX, kursorY] = map.szyldy.indexOf(szyld);

Edit: teraz zauważyłem, że każdy szyld ma swoją nazwę - w takim razie wystarczy zmiana na Dictionary, jak napisał @unikalna_nazwa.


Btw, **NIE** pisz kodu w języku polskim, tylko po angielsku...
0
if (map.typ[kurosr.X,kursor.Y] == szyld) 

Tutaj szyld i map.typ jest akurat na chwilę obecną typu uint, (może później przerobie na enum aby było czytelniej)
Czyli np.

map.typ == wartość

sprawdzam czy to np. skrzynia, podłoże, szyld itp...

ze słownika nie korzystałem, muszę poczytać. Będę pisał jeszcze jak bym miał problem :)

w programie mam po angielsku ale czasem to się gryzie jedno z drugim skoro cokolwiek stworzę będzie po Polsku

1

void dodajObiekt(Szyld nowySzyld)
{
map.szyldy.Add(nowySzyld);
map.typ[kursorX,kursorY] = szyld;
}

Wtedy tworzysz ten szyld przed wywołaniem funkcji i masz do niego pełny dostęp. Nie musisz nic szukać.
albo
<code class="c#">void dodajObiekt(Szyld nowySzyld, int x, int y)
{
    map.szyldy.Add(nowySzyld);
    map.typ[x,y] = szyld;
}

nie wiem dokładnie jak masz to rozplanowane

@Braindead
ok, teraz rozumiem o co ci chodzi

0

@ Sopelek

Tak robię podobnie, ale chodzi mi już o dalsze czynności np. najechaniem kursora na daną pozycje gdzie leży jakiś obiekt. Kliknięcie np. 'i' i co by tam nie było wyświetla się informacja o tym obiekcie.

Zrobiłem tak :

Dictionary<int,Board> boards { get; set; }

I wyświetlenie nazwy i tekstu :

           
 if (map.typ[cursor.X, cursor.Y] == 8) // 8 = szyld
 {
    if (map.boards.ContainsKey(map.nr[cursor.X, cursor.Y]))
    {
          textXY(35, 10, map.boards[map.nr[cursor.X, cursor.Y]].name);

          for (int j = 0; j < map.boards[map.nr[cursor.X, cursor.Y]].note.Count; j++)
          {
                textXY(35, 12 + j, map.boards[map.nr[cursor.X, cursor.Y]].note[j]);
          }
     }
}

Całość działa. Ale teraz wydaje mi się że można było by to zrobić na List ?

I jeszcze pytanie jest jakaś różnica w działaniu jeśli bym zamienił int z Board ?

Dictionary<int,Board> 
Dictionary<Board,int>
1
Braindead napisał(a):

W sumie nic ciekawego nie wymyśliłem, poza np. przeszukiwaniem całej listy i sprawdzanie czy dany szyld stoi na X,Y ale pewnie to jest głupota.

Nie, to nie jest głupota, to jest bardzo poprawne rozwiązanie, gdy chcesz znaleźć obiekt w kolekcji.
Możesz w tym celu użyć pętli, ale zwięźlej będzie przy użyciu LINQ, np. tak:

var coś = listaCosiów.SingleOrDefault(x => x.Id == obiektDoPorównania.Id);

Dictionary<> nie jest tu do niczego potrzebny.

Braindead napisał(a):

I jeszcze pytanie jest jakaś różnica w działaniu jeśli bym zamienił int z Board ?

Dictionary<int,Board> 
Dictionary<Board,int>

A czym się różni słownik polsko-angielski od angielsko-polskiego?

1 użytkowników online, w tym zalogowanych: 0, gości: 1