Come gestire un elenco aggregato dei campi di più oggetti?

2

Ho alcuni oggetti ciascuno contenente un elenco di variabili e un elenco che contiene tutte le variabili di questi oggetti, ad esempio

class A
{
   List<Var> varList;
}

class B
{
   List<A>   aList;
   List<Var>   allVarOfAs; 
  // it is a common list which holds the members of varList of all members of the aList
}

Ora, se un oggetto da varList in un oggetto di aList (un oggetto A in B ) viene rimosso, come posso aggiornare la lista comune allVarOfAs ?

Qual è lo schema per tale situazione?

    
posta Ahmad 01.06.2015 - 15:52
fonte

2 risposte

5

La soluzione più semplice è NON avere l'elenco aggregato ' allVarOfAs '. Invece rendilo un metodo o una proprietà che restituisce l'elenco aggregato al volo, ma facendo un SelectMany su aList . Per esempio.

IEnumerable<Var> allVarOfAs 
{
     get
     {
          return aList.SelectMany(a=>a.varList);
     }
}

o

List<Var> allVarOfAs
{
     get
     {
          return aList.SelectMany(a=>a.varList).ToList();
     }
}
    
risposta data 01.06.2015 - 16:28
fonte
0

Per prima cosa aggiungi un po 'di incapsulamento e supponi di dichiarare i tuoi campi privati e definisci public add e remove metodi nella classe B (che aggiunge e rimuove A istanze). Quindi, add e remove saranno disponibili per l'aggiornamento di allVarOfAs .

Il problema con questo approccio è che finché un oggetto altro ha un riferimento allo stesso aList (direttamente o avendo un riferimento a A ), può modificare senza passare per l'istanza B . Dovresti assicurarti che nessuna istanza della classe A sia mai condivisa con altri oggetti e che A.varList sia modificata solo da un oggetto B (altrimenti, l'unione effettiva di liste e quella calcolata in B potrebbe differire).

È più semplice e sempre corretto ricalcolare allVarOfAs quando necessario (vedi risposta di JacquesB ).

Il mantenimento di allVarOfAs potrebbe essere eseguito in modo incrementale: ma è davvero necessario?

    
risposta data 01.06.2015 - 16:50
fonte

Leggi altre domande sui tag