442 messaggi dal 09 marzo 2006
Ciao.
Ho due dictionary uno con una key stringa id e come valore una classe entity e una con una key stringa ref e come valore un entity.
Ecco io vorrei aggiornare i riferimenti e fare in modo che le entity del dictionary ref prendessero l entity corrispondente tra i valori del dictionary id.
Il problema e che lavoro con delle copie e non dei riferimenti e se cambio un entity del ref non si riperquote sulle stesse entity contenute nell id.
E un grafo di entity che non so come risolvere in c++ userei una mappa di riferimenti e cambierei il vakore dell oggetto puntato dal riferimento. Come si fa in c#?
Si puo fare?
Grazie tante
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Giuseppe,


e se cambio un entity del ref

Cosa intendi con "cambio"? Vuoi dire che assegni un'altra istanza ad una chiave del dizionario? Cioè fai questo?
dizionario["chiave"] = altraIstanza;


Dato che hai due dizionari, sta a te l'onere di tenere sincronizzati i due valori, quindi dovresti fare:
dizionario["chiave1"] = altraIstanza;
dizionario2["chiave2"] = altraIstanza;


Oppure, anziché usare due dizionari, ti crei una lista di un tipo creato da te:
public class MetadatiEntità {
  public string Chiave1 {get; set;}
  public string Chiave2 {get; set;}
  public object Entità {get; set;}
}

In questo modo, Chiave1 e Chiave2 assumeranno i valori delle chiavi che avevi nei dizionari e saranno logicamente "vicini" alla loro entità perché situati nella stessa istanza di MetadatiEntità.
In questo esempio ho messo i setter pubblici, ma puoi anche renderli privati e obbligarti ad aggiornare quell'oggetto attraverso un metodo che si occuperà di tenere coerenti Chiave1, Chiave2 ed Entità.

ciao,
Moreno

Enjoy learning and just keep making
442 messaggi dal 09 marzo 2006
Grazie moreno.
Scusa ma volevo chiarire.
Sto facendo una deserializzazione su classi generate da un xsd.
Come tu sai benissimo ho una serie di entita(oggetti) deserializzate dal documento xml.
Alcune entita hanno l attributo id e quindi il contenuto, altre il ref cioè bisognerebbe agganciarci un oggetto id corrispondente.
Tutte le entita derivano dalla classe base entity.
Ora ho cercato di risolvere questo grafo di entity con due liste dei ref e degli id sbagliando miseramente.
Uno dei problemi e che dentro gli id possono esserci ref e andrebbero risolti. Per risolti intendo che quel membro di id con il ref deve essere sostituito da un entity con id corrispondente.ho scritto membro ma in realtà preciso sono proprieta di classi che derivano da entity e dentro queste proprieta ci puo essere un altro ref.capito il casino?
Esiste secondo te una soluzione non troppo complessa per risolvere il grafo? Magari stavo pensando a linq.
Preciso che anche i ref sono di tipo entity e sono una oggetto ( un istanza diversa dal suo corrispettivo id) ma senza contenuto ma con una proprieta ref definita che punta ad un id.
La classe entity infatti ha due proprieta oltre ad altre id e ref.
Grazie.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Giuseppe,


capito il casino?

No, mi spiace ma non riesco a visualizzare la cosa. Dovresti preparare un esempio di codice su DotNetFiddle in cui si vedono giusto i due dizionari popolati con qualche voce e magari il risultato che vorresti ottenere.

ciao,
Moreno

Enjoy learning and just keep making
442 messaggi dal 09 marzo 2006
guarda Moreno è un po difficile da spiegare ma alla fine una risoluzione dalle mappe dei ref/id quando serve nel visitor puo andare bene secondo me, io uso un visitor per ogni elemento architettonico che voglio usare , ti posto l'esempio.
questo è il visitor specifico che eredita da Visitor:
class ColumnsVisitor : Visitor
    {
        public override bool visitIfcColumn(IfcColumn value)
        {
            value.Representation.Item.acceptVisitor(this);

            return true;
        }
        public override bool visitIfcProductDefinitionShape(IfcProductDefinitionShape value)
        {
            if (value.@ref != null)
                value = (IfcProductDefinitionShape)Singleton.Instance.Resolve(value);
            string str = value.Representations.IfcRepresentation[0].@ref;
            return true;
        }
        public override bool visitIfcProductRepresentation(IfcProductRepresentation value)
        {
            if (value.@ref != null)
            {
                IfcProductDefinitionShape value1 = (IfcProductDefinitionShape)Singleton.Instance.Resolve(value);
                value1.acceptVisitor(this);
            }
            return true;
        }
    }

Visitor un pezzo
 public class Visitor
  {

   //public virtual bool visitEntity(Entity value)
   //{
   //  return false;
   //}

    public virtual bool visitIfcStructuralConnectionCondition(IfcStructuralConnectionCondition value)
    {
      return false;
    }

    public virtual bool visitIfcStructuralLoad(IfcStructuralLoad value)
    {
      return false;
    }

    public virtual bool visitIfcStructuralLoadStatic(IfcStructuralLoadStatic value)
    {
      return false;
    }

    public virtual bool visitIfcRoot(IfcRoot value)
    {
      return false;
    }

    public virtual bool visitIfcOwnerHistory(IfcOwnerHistory value)
    {
      return false;
    }

in pratica nel visitor specifico faccio l'override delle funzioni con i tipi che mi interessano e per risolvere un tipo faccio oggettotipo.acceptchanges(this) dove this è questo visitor quindi se uso un override gestito bene col double dispatch mi risolve il tipo, puo essere giusto?
il problema è che il resolve deve essere una funzione del genere:
  public Entity Resolve(Entity ent)
    {
        if(ent.@ref != "")
            return lid[ent.@ref];//lid è la mappa chiave(ref) valore(entity di quell id)
        return ent;
    }

mi torna un oggetto di classe entity e il double dispatch non funziona piu e non so come fare.non vorrei fare casting perchè non so che tipo di oggetto avro runtime quello sara risolto dal visitor e processato nella funzione di cui faccio l'override in modo diverso a seconda del tipo.
creo cioè dei comportamenti di parsing diversificati all interno della funzione del tipo risolto ad doc.
Se uso la funzione resolve posso anche creare l'accept visitor nell' oggetto entity ma mi da stack overflow perchè tutti i tipi derivano da entity quindi non risolvo piu il tipo.
grazie.
ciao.
scusa se non capisci ancora qualora lascierò perdere ciao e scusa.
grazie.
Modificato da giuseppe500 il 01 dicembre 2016 18.17 - scusami ho capito l'errore, le funzioni nel visitor si devono chiamare tutte visit(con il value diverso)
scusa.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Giuseppe,


ho capito l'errore, le funzioni nel visitor si devono chiamare tutte visit(con il value diverso)

ok, quindi adesso sei riuscito a farlo funzionare?
Non ti scusare, io se posso ti aiuto volentieri ma la questione non è semplicissima da capire. Ho familiarità con i Visitor ma mi trovo lo stesso in difficoltà.

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.