C# lista adott példányára mutatás egy előre meghatározott érték segítségével (id, név...) for ciklus mellőzésével, lehetséges?
Talán kicsit kusza a kérdés, de a lényeg a következő. Egy Szerver-Kliens megvalósítás a lényeg, ahol tételezzük fel, hogy minden adott, és működik is. Van egy lista, ami a szerveren tárolja a csatlakozott klienseket. Ugyanezek a példányok megtalálhatók minden kliensnél is, mivel valami alapján azonosítani kell mindenkit mindenkinél. Tetszés szerint azonosíthatjuk a példányokat, tehát lehet egyedi ID, vagy akár string is, ez most nem lényeges. A lényeg, hogy a csatlakozni kívánt fél a csatlakozást követően kap a szervertől egy egyedi ID -t, vagy pedig ha név alapján azonosítunk (ha még nem foglalt a szerveren), akkor az alapján lesz a későbbiekben számon tartva.
A kliens a későbbiekben küld üzeneteket a szervernek. Itt mi határozzuk meg a protokollt, vagyis hogy magát az adatot hogyan értelmezzük a továbbiakban. Az alap felállás az, hogy a kliens elküldi az üzenetben az egyedi ID -jét is, innen a szerver tudja, hogy melyik kliens példánnyal kell manipulációt végrehajtani a listában. Itt ezt eddig úgy oldottam meg, hogy az üzenet fogadásakor egy for ciklussal bejártam a lista összes elemét, és ahol az üzenetben érkezett ID megegyezik egy már létező lista elem ID adattagjával, akkor azzal lesz valami végrehajtva. Na most ez így ebben a formában eléggé erőforrás igényes lehet, ha több kliens van, és rengeteg üzenet érkezik valós időben.
Létezik-e olyan megoldás, hogy én egyből ráindexelek a Lista adott elemére, ami az üzenetben található ID -t képviseli, tehát nem kell for ciklussal mindig bejárni a listát és így megkeresni?
Lényegében ezt szeretném elkerülni, már ha lehetséges:
NetIncomingMessage message; //id + egyéb (több féle típusú adatot is tartalmazhat)
int id = message.ReadInt32();
string str = message.ReadString();
for (int i = 0; i < Connections.Count; i++)
{
if (Connections[i].ID == id)
Connections[i].text = str;
}
Ehelyett valami ilyesmit szeretnék:
Connections[id -vel direktben rámutatni a kívánt elemre].text == ...
Varázsolni nem lehet, a semmiből honnan tudná a gép, hol talál egy random elemet?
Ahogy bármilyen adatbázist, ezt is optimalizálni kell.
Azt javaslom, különböző kulcsok alapján sorbarendezve akár listába, fába... tárold el külön a mutatókat, és akkor sokkal gyorsabb lesz.
A problémád röviden ha jól értem: keresel egy elemet a listádban ID alapján.
Nagyon egyszerű! Ismerkedj meg a lamdba függvényekkel (lambda functions, arrow functions).
MyClass result = list.Find(x => x.GetId() == "xy");
magyarázat: a listádra hívott Find függvénynek átadod a lista egy elemét, ami vissza fogja adni azt az elemet, ami true-t ad vissza az összehasonlításra.
#4: ez nem varázslás, ezt írtam a kommentemben is:
"Azt javaslom, különböző kulcsok alapján sorbarendezve akár listába, fába... tárold el külön a mutatókat, és akkor sokkal gyorsabb lesz."
Most hogy konkrétan a hash-t nem írtam le, attól még az odatartozik; Ettől függetlenül a program ott sem a semmiből találja ki, hanem tárol hozzá egy táblát, ami a címeket tartalmazza.
#2: a lambda find szerintem belül szintén egy for ciklusos lineáris keresést futtathat, mert nincs neki semmi indexelés.
Visszatérve az eredeti problémára: továbbra is el kell tárolni valahogyan rendezetten az elemeket, anélkül csak lineáris keresés lehet.
Sokmindentől függ, mi az optimális, de első körben a Hash-táblás, és a bináris fás megoldásnak néznék utána a helyedben, ezeket könnyű megvalósítani, és sokat dobnak a sebességen.
5
Milyen táblát tárol hozzá? A Hash Table maga az adatszerkezet neve, nem egy külön tábla, ami el van valahol tárolva. A hash függvény találja meg a megfelelő indexet beszúrásnál és kivételnél is. Ha ba.zol megnézni a videot amit linkeltem, akkor így jártál.
És igen, kvázi egyből rá lehet mutatni egy elemre a felhasználásával, legalábbis mégha nem is egyből, ha bináris fával van megoldva 1-1 index objektuma, akkor (valószínűleg) a lehető leggyorsabb algoritmust kaptad.
5
Vagy amit a 3-as írt, a Dictionary is egy hash table, de a hash tableben nem feltétlen kell kulcs-érték pár, hogy működjön, lehet az érték maga a kulcs is.
5
Csak kérdezem halkan: szerinted az összes "előre megírt" függvény milyen alapon működik? Ugyan az a for ciklus fog lefutni, csak a lehető legoptimalizáltabb változatban, hogy ne neked kelljen leírni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!