Avatar
David Podeszwa:

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. února 8:44
Avatar
Odpovídá na David Podeszwa
Michal Štěpánek:

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. února 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:

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. února 9:58
Avatar
Luboš Běhounek (Satik):

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

Nahoru Odpovědět 28. února 10:40
:)
Avatar
Odpovídá na ostrozan
David Podeszwa:

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

 
Nahoru Odpovědět 28. února 11:59
Avatar
Odpovídá na Luboš Běhounek (Satik)
David Podeszwa:

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. února 12:06
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na David Podeszwa
ostrozan:

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. února 12:58
Avatar
Petr Čech (czubehead):

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. února 13:21
Why so serious? -Joker
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
Jan Vargovský:

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

 
Nahoru Odpovědět  +1 28. února 13:34
Avatar
Odpovídá na Petr Čech (czubehead)
David Podeszwa:

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. února 13:38
 
Nahoru Odpovědět  +1 28. února 13:37
Avatar
Odpovídá na David Podeszwa
Luboš Běhounek (Satik):

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. února 13:55
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 28. února 13:55
:)
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na David Podeszwa
ostrozan:

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. února 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.