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 == ...
10
Na, örülök hogy végre van valaki, aki érti. Első gondolatom nekem is az volt, hogy adatbázis, ami amúgy is hashelve van, de a példában ez volt:
for (int i = 0; i < Connections.Count; i++)
{
if (Connections[i].ID == id)
Connections[i].text = str;
}
Ami számomra nem adatbázisra utal, vagy nem tudom...
nem értelek titeket.. srácok figyeljünk már:
kliens oldal - szerver oldal
mind a két környezetben ugyan az a lista (hogy miként töltjük fel őket, az édesmindegy, mert nem ez a probléma), tehát a két lista szinkronizált.
Semmi mást nem kell tenni, csak id alapján visszaadni az objektumot amit keresünk.
Ennyi az egész, ne gondoljuk túl.
12
A kérdés nem arról szólt, hogy hogyan lehet megtalálni egy elemet, hanem arról, hogy hogyan lehet !gyorsan! megtalálni egy elemet, és az nem a .find metódus lesz.
A kérdés lényegében ez volt:
"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?"
A válasz pedig hash table.
12
(vagy egyéb adatstruktúrák, amik ugyanúgy hash alapján működnek, mint a dictionary a 3. válaszban)
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, 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!