Mai multe opțiuni pentru chei într-un dicționar?

În jumătate de timp trebuie să găsesc o valoare bazată pe șir, numele ei și cealaltă jumătate trebuie să găsesc o valoare bazată pe un int, numele de utilizator al acestora.

În prezent am două dicționare pentru a rezolva această dilemă - una care folosește un șir ca o cheie și una care folosește un int ca o cheie. Mă întrebam dacă există o modalitate mai eficientă de a face acest lucru - o modalitate de a obține o valoare bazată pe șir int sau .

    public static Dictionary nPlayers = new Dictionary();
    public static Dictionary sPlayers = new Dictionary();

După scanarea celorlalte întrebări, cineva a menționat folosind un dicționar de dicționare. Dacă cineva poate elabora acest lucru (dacă este soluția pe care o caut), asta ar fi mare

Nu știu prea multe despre o tuplă, dar din ceea ce am înțeles, necesită două chei și ceea ce căutam ia unul sau altul.

Would Dictionary do the trick? I have no idea.

Te rog ajută-mă în experiența mea de codificare îngustă. ; _;

0
Înfășurați-l într-o clasă de containere :)
adăugat autor leppie, sursa
adăugat autor nawfal, sursa
Damith: Da, obiectul Player conține ID-ul și numele de utilizator, dar am nevoie de o modalitate organizată de cunoaștere a fiecărei persoane care este logată.
adăugat autor Tako M., sursa
două dicționare distincte sunt mai bune, dar de ce păstrați dicționare aici, nu aveți proprietate pentru ID-ul utilizatorului și numele în obiectul playerului?
adăugat autor Damith, sursa

4 răspunsuri

Doriți să știți în viitor tipul original de date care a fost introdus în dicționar? Dacă nu, aveți două opțiuni:

  1. Tastate cu litere strânse ! - Folosiți doar o cheie ca cheie și atunci când adăugați la ea, sunați .ToString() pe întregi:)

    Fii obiect ive - foloseste un obiect ca cheia,/p>

Bazându-vă pe cele două, aș recomanda prima deoarece încă mai aveți restricții de tip acolo.

If you do want to know the original data type in the future - your implementation is fine :)

0
adăugat

Ca pe comentariul dvs., atunci când utilizatorul este conectat la sistemul pe care îl adăugați într-un dicționar, aici trebuie să adăugați la ambele dicționare.

Cred că puteți face acest lucru într-un alt mod,

   public static List nPlayers = new List();

Doar ai nevoie, adaugă jucători când te-ai autentificat.

Dacă doriți să căutați după ID, Nume sau orice altceva puteți interoga nPlayers și pentru a găsi Playerul.

 var playerByID = nPlayers.Where(p= p.ID==givenID).FirstOrDefault();

 var playerByName = nPlayers.Where(p= p.Name==givenName).FirstOrDefault();
0
adăugat
Nu cred că există o întrebare legală. Voi folosi lista și când trebuie să o caut, voi folosi o buclă de foreach.
adăugat autor Tako M., sursa
mai bine încercați și vedeți :) puteți înclina ceva dacă nu știți
adăugat autor Damith, sursa

Soluția dvs. (2 dicționare) este una corectă. Dicționarul poate fi indexat numai printr-o cheie stabilă. Ca urmare, trebuie să păstrați dicționarele separate pentru a indica prin diferite chei.

0
adăugat

I don't think having a Dictionary is a better idea than having two distinct dictionaries. It will probably take the same amount of memory (since each Player reference will still be stored twice in the unified dictionary), will probably be less clear, and might (conceivably) cause problems with hashcode collisions since your key can be several different types.

Aș păstra doar două dicționare, PlayersByName și PlayersByID și le folosiți când este cazul.

0
adăugat