Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
David Podeszwa:28.2.2016 8:44

Začal jsem pracovat na takové menší aplikaci a narazil jsem na problém. Chtěl bych se zeptat jestli jde nějak vytvořit více klíčové Dictionary. Na googlu jsem našel že se to používá za pomocí Tuples ale potřebuju to udělat tak abych mohl pokaždé v jiné metodě vracet pomocí jiného klíče.

public Dictionary<Tuple<int,String>,Client> Clients = new Dictionary<Tuple<int, string>, Client>();¨
public Client GetByName(String Name)
{
//Ziskalo by z dictionary pomoci klice String
}
public Client GetByID(int ID)
{
//Ziskalo by pomoci ID
}

Asi tak nejak.
Ještě mně napadlo pouziti dvou dictionary najednou,kazde s jinym typem klice a když bych pridaval nebo odebiral tak s obou najednou ale to si myslim ze není moc skvele reseni navíc dosti RAM využívající a kdybych mel klientu v dictionary více tak nevím jak by to dopadlo.
Má tady někdo nějaký zajímavý nápad jak to vyřešit?

 
Odpovědět
28.2.2016 8:44
Avatar
Odpovídá na David Podeszwa
Michal Štěpánek:28.2.2016 9:15

Kdybys nám vysvětlil, čeho chceš vy finále dosáhnout, třeba by se to dalo řešit jiným, elegantnějším způsobem...

Nahoru Odpovědět
28.2.2016 9:15
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
David Podeszwa:28.2.2016 9:58

Prostě potřebuji z nějaké kolekce (jakýmkoli způsobem ),vytahovat za běhu klienty podle jejich Socketu nebo jména.
Dělám totiž aplikaci na chat a ve chvíli kdy přijde od někoho zpráva netuším kdo to je jediné co vím je jeho Socket a data která mi od něj přišla proto potřebuji podle toho socketu nějak zjistit jaký je to klient(to je vlastní objekt) abych mohl jeho zprávu uložit do databáze a rozeslat ostatním pod jeho jménem.
Zároven ale potrebuju nekdy zaslat danému klientovi zprávu ale vím pouze jeho jméno a tak zase potrebuji vedet co je to za klienta.

 
Nahoru Odpovědět
28.2.2016 9:58
Avatar
Luboš Běhounek Satik:28.2.2016 10:40

Na to bych použil dva dictionary getbyid by koukalo do jednoho a getbyname do druheho

Nahoru Odpovědět
28.2.2016 10:40
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na ostrozan
David Podeszwa:28.2.2016 11:59

Ty jsi to asi nepochopil ja nechcu vrátit klic k danemu objektu ale chci mit vice klicu

 
Nahoru Odpovědět
28.2.2016 11:59
Avatar
Odpovídá na Luboš Běhounek Satik
David Podeszwa:28.2.2016 12:06

No to jsem do te otázky napsal jako jednu s variant které bych se chtěl vyhnout. Ale očividně to bude asi nejlepší řešení.Zkusím ještě hledat.Možná ještě přijdete s nějakým lepším nápadem

 
Nahoru Odpovědět
28.2.2016 12:06
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na David Podeszwa
ostrozan:28.2.2016 12:58

V tom případě si udělej vlastní třídu, klidně odděděnou od Dictionary a klíčů si tam dej, kolik potřebuješ.

 
Nahoru Odpovědět
28.2.2016 12:58
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:28.2.2016 13:21

Udělej si prostě kolekci která bude dědit z listu a přidej si tam metody, které budou používat LINQ, třeba takto

class MyCollection:List<Client>
{
        public Client GetClientById(int id)
        {
                return this.First(c=>c.Id==id);
        }

        public Client GetClientBySocket(string socket)
        {
                return this.First(c=>c.Socket==socket);
        }
}
Nahoru Odpovědět
28.2.2016 13:21
the cake is a lie
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:28.2.2016 13:34

Něco o rychlosti vyhledávání v hashovací tabulce x listu jsi slyšel? :)

 
Nahoru Odpovědět
28.2.2016 13:34
Avatar
Odpovídá na Petr Čech
David Podeszwa:28.2.2016 13:37

Díky to vypadá dobře očividně to funguje,na LINQ jsem se nikdy moc nedíval.Zajímalo by mně jak moc je to náročné,myslím výkonově a jak je to rychlé

Editováno 28.2.2016 13:38
 
Nahoru Odpovědět
28.2.2016 13:37
Avatar
Odpovídá na David Podeszwa
Luboš Běhounek Satik:28.2.2016 13:55

Pomalé, lineární složitost.

Pokud ti vadí mít dva slovníky podle různých klíčů, tak ještě to můžeš udělat tak, že si uděláš

Dictionary<int, Client>

s daty
a k tomu

Dictionary<string,int>

který použiješ pro získání id z jména pro přístup do druhého Dictionary.

Pořád by jsi byl na (téměř) konstantní složitosti.

Editováno 28.2.2016 13:55
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
28.2.2016 13:55
https://www.facebook.com/peasantsandcastles/
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na David Podeszwa
ostrozan:28.2.2016 15:23

Luboše asi netrumfnu, ale kdybys chtěl vyšetřit jednu koleci a nepotřeboval využívat všech výhod Dictionary , tak jsem si udělal takové cvičení :-)

public class MyDictionary
  {

      private List<string> name = new List<string>();
      private List<int> id= new List<int>();
      private List<Client> clients = new List<Client>();

      public void Add(string name,int id, Client client)
      {
          this.name.Add(name);
          this.id.Add(id);
          this.clients.Add(client);
      }


       //jednotlive
      public Client GetById(int ID)
      {
          return clients[id.IndexOf(ID)];
      }

      public Client GetByName(string Name)
      {
          return clients[name.IndexOf(Name)];
      }


      //nebo pretizena metoda
      public void Remove(int ID)
      {
          int index = id.IndexOf(ID);
          clients.RemoveAt(index);
          name.RemoveAt(index);
          id.RemoveAt(index);
      }


      public void Remove(string Name)
      {
          int index = name.IndexOf(Name);
          clients.RemoveAt(index);
          name.RemoveAt(index);
          id.RemoveAt(index);
      }

  }
 
Nahoru Odpovědět
28.2.2016 15:23
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.