Collegamento di una matrice di oggetti a un enumeratore

2

Come metteresti in relazione gli indici di una matrice con un enumeratore senza lasciare la possibilità di una mancata corrispondenza? Esempio

public enum difficulties {
   easy,
   medium, 
   hard
}

public List<Lobby> easyLobbies = new List<Lobby>();
public List<Lobby> mediumLobbies = new List<Lobby>();
public List<Lobby> hardLobbies = new List<Lobby>();

public List<Lobby>[] lobbiesArray;

public ClassConstructor(){
    // Index order should match enumerator
    lobbiesArray = new List<Lobby>[] { easyLobbies, mediumLobbies, hardLobbies};
}


List<Lobby> lobbies = lobbiesArray[difficulties.hard];

Poiché questo enumeratore e array sono apparentemente scollegati, non è ovvio che le lobbiesArray debbano seguire qualsiasi ordine. Qual è un modo migliore per avvicinarsi a questo?

    
posta user2410532 30.08.2015 - 00:11
fonte

2 risposte

10

Stai utilizzando una struttura dati errata.

Nel tuo caso, puoi utilizzare un dizionario in cui le chiavi sono i valori dell'enumerazione e i valori sono gli elenchi effettivi:

var lobbies = new Dictionary<Difficulty, List<Lobby>>
{
    { Difficulty.Easy, easyLobbies },
    { Difficulty.Medium, mediumLobbies },
    { Difficulty.Hard, hardLobbies },
};

var currentLobbies = lobbies[Difficulty.Hard];

Alcune note:

  1. Un array è in gran parte sempre una struttura dati errata in C #. Non usarlo, a meno che tu non sia perfettamente sicuro che hai bisogno delle caratteristiche specifiche di un array.

  2. A meno che la tua squadra non abbia una convenzione di stile consolidata (e le incongruenze nel codice mi fanno pensare che non ce ne sono), segui gli standard. Ciò significa che enum Difficulties , con un capitale D . Anche i membri di un enum iniziano con una capitale. Puoi utilizzare StyleCop per controllare altre violazioni (come la mancanza di una nuova riga prima della parentesi graffa aperta).

  3. Dato che l'enumerazione non contiene flag, il suo nome dovrebbe essere Difficulty , non Difficulties . Quando si utilizza plurale, significa che è possibile utilizzare più valori contemporaneamente. Altro su flag qui .

  4. lobbiesArray è un nome errato. Non dovresti avere tipi nei nomi delle variabili. Visual Studio semplifica molto la determinazione del tipo di una determinata variabile, quindi non hai bisogno della notazione ungherese o di costrutti simili.

  5. ClassConstructor è un nome fuorviante per un metodo, perché fa pensare al lettore che si tratta di un vero costruttore, mentre non lo è (a meno che tu non abbia effettivamente chiamato la tua classe ClassConstructor , che è un nome strano per un class.)

risposta data 30.08.2015 - 00:33
fonte
3

Relating an array of objects to an enumerator

Intendi che mette in relazione un array di oggetti con un enum?

Se sì, allora che ne dici di questo ...

it is not obvious that the lobbiesArray should follow any order.

Rendilo ovvio implementando; Lobby : IComparable , utilizzando enum . L'ordine dichiarato in enum è pertinente

public int CompareTo(object other) {
    if(other == null) return 1;
    if(!other is Lobby) return 1;
    if((int)this.Difficulty > (int)other.Difficulty)) return 1;
    if ((int)this.Difficulty < (int)other.Difficulty)) return -1;
    return 0;
}

Quindi il seguente ordinamento / gruppo per enum ordine:

myLobbies.Sort();

Se List<Lobby> deve essere sottordinato, modificare CompareTo per includere tutte le proprietà necessarie.

Per rendere ancora più ovvio circa il enum , eliminerei l'array e implementerei un LobbyCollection .

public class LobbyCollection {
    protected List<Lobby> Lobbies;

    // pretend we have constructor and Add method(s) as needed

    // might want to return a LobbyCollection instead.
    public List<Lobby> GetLobbies(Difficulty ofThisDifficulity) {
        return this.Lobbies.FindAll(aLobby => aLobby.Difficulty == ofThisDifficulty);
    }
}

Quindi le dichiarazioni enum , interface implementazione e LobbyCollection che espongono solo il comportamento Lobby definito insieme rendono evidente come usare Lobby . E i clienti non devono inventarsi roba - con codice client diverso probabilmente fare le cose solo in modo leggermente diverso.

    
risposta data 30.08.2015 - 06:12
fonte

Leggi altre domande sui tag