Diskuze: Víceklíčové Dictionary C#
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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...
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.
Na to bych použil dva dictionary getbyid by koukalo do jednoho a getbyname do druheho
Ty jsi to asi nepochopil ja nechcu vrátit klic k danemu objektu ale chci mit vice klicu
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
V tom případě si udělej vlastní třídu, klidně odděděnou od Dictionary a klíčů si tam dej, kolik potřebuješ.
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);
}
}
Něco o rychlosti vyhledávání v hashovací tabulce x listu jsi slyšel?
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é
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.
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);
}
}
Zobrazeno 13 zpráv z 13.