Kezdőoldal » Számítástechnika » Programozás » C# lista adott példányára...

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?

Figyelt kérdés

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 == ...



2021. febr. 9. 21:48
1 2
 1/14 anonim ***** válasza:

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.

2021. febr. 9. 21:51
Hasznos számodra ez a válasz?
 2/14 anonim ***** válasza:

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.

2021. febr. 9. 22:29
Hasznos számodra ez a válasz?
 3/14 anonim ***** válasza:
Dictionary
2021. febr. 10. 07:53
Hasznos számodra ez a válasz?
 4/14 anonim ***** válasza:
2021. febr. 10. 11:18
Hasznos számodra ez a válasz?
 5/14 anonim ***** válasza:

#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.

2021. febr. 10. 18:44
Hasznos számodra ez a válasz?
 6/14 anonim ***** válasza:

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.

2021. febr. 10. 19:14
Hasznos számodra ez a válasz?
 7/14 anonim ***** válasza:

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.

2021. febr. 10. 19:17
Hasznos számodra ez a válasz?
 8/14 anonim ***** válasza:

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.

2021. febr. 10. 19:28
Hasznos számodra ez a válasz?
 9/14 anonim ***** válasza:
Find metodus egyszeru linearis kereses, vegig megy a listan az elso talalatig a dokumentacio szerint, vagyis o(n). Szoval inkabb hash, ami o(1), foleg, hogy olyan objektumrol van szo, amit egyertelmuen azonosit valamelyik tagja. De igazabol ez mar adatbazis hataskore, ahol meg alapbol
2021. febr. 10. 20:52
Hasznos számodra ez a válasz?
 10/14 anonim ***** válasza:
..alapbol keszen van talalva az optimalizalt kereso algoritmus.
2021. febr. 10. 20:53
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!