252 messaggi dal 03 dicembre 2001
www.fuossbook.it
Ciao a tutti,
vorrei modificare le proprietà di un oggetto all'interno di un ciclo for

il mio oggetto Question ha una proprietà int Occurance

in un ciclo in cui vado a duplicare l'oggetto section per aggiungerlo all'oggetto doubleQuestions
vorrei assegnare la proprietà Occurance con l'indice del mio ciclo

quello che ottengo alla fine che se per esempio ciclo 5 volte
tutti gli oggetti Question avranno la propietà Occurance a 5 e non 1,2,3,4,5

 if (occuranceVal > 0)
            {

                var section = questionnaire.Sections.FirstOrDefault(s => s.Id == sectionID);

                for (int i = 1; i <= occuranceVal; i++)
                {
                    
                    
                    foreach (var quest in section.Questions)
                    {
                        quest.Occurance = i;
                    }

                            doubleQuestions.AddRange(section.Questions)  ;
                    
                }
                section.Questions.AddRange(doubleQuestions);


            }




Come potete vedere dal codice la proprietà la modifica la effettuo prima del AddRange
Cosa sto sbagliando?
Grazie

***************************
webmaster di:
hydrasail.blogspot.it
fuossbook.it
***************************
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
il problema si verifica perché stai agendo sempre sulle stesse istanze di Question.
Infatti, quando scrivi questo:
doubleQuestions.AddRange(section.Questions);

Non è che quelle Questions si duplicano. Le istanze sono sempre le stesse.
Alla fine del ciclo, ti trovi con una lista doubleQuestions che contiene molteplici riferimenti alla stessa istanza di Question.

Forse quello che ti serve è clonare le Question. Prova ad usare il metodo DeepClone che trovi in questa discusione.
https://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-of-an-object-in-net-c-specifically

Però spiega bene perché vuoi clonare le Question.

ciao,
Moreno

Enjoy learning and just keep making
252 messaggi dal 03 dicembre 2001
www.fuossbook.it
Ciao Moreno grazie per la risposta.
Quello che devo realizzare è un questionario/form con domande divise a sezioni
Alcune domande hanno il tasto + per aggiungere(duplicare) la stessa sezione, per esempio in caso di figli aggiungi delle sezioni contenenti un blocco di domande(identiche) riguardanti i figli, anche gli id delle domande presenti nel db ovviamente è la stessa, perchè sono uguali.
il tasto + richiama tramite ajax una viewpartial a cui passo il modello delle domande in base quindi alla sezione che si è scelta di duplicare, per questo duplico in modo identico.
quello che però tento di fare nel creare il modello è assegnare questo valore occurance che identifica il blocco di sezione anche per capire registrare i dati.
quindi i figli sono 3
allora dovrò avere tre sezioni identiche con domande identiche differenziate solo da questo id occurance
per questo motivo richiamo le domande dal db secondo la sezione e poi con un ciclo le aggiungo al modello che dopo passo alla view parziale che ritorna l'ajax
spero di essere stato più chiaro, su quello che vorrei fare
nel ciclo man mano vedo che l'id è differente ma poi alla fine mi trovo tutte le domande con occurance 5 (se i figli sono 5)
Grazie

***************************
webmaster di:
hydrasail.blogspot.it
fuossbook.it
***************************
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


allora dovrò avere tre sezioni identiche con domande identiche differenziate solo da questo id occurance

Ok, ti ringrazio per il chiarimento.
Secondo me, la proprietà Occurrence non dovrebbe trovarsi dentro la classe Question.
Un conto è la domanda, e un conto è la sua occorrenza all'interno del questionario.

Dovresti crearti una ulteriore classe chiamata QuestionOccurrence così definita.
public class QuestionOccurrence {
  public int OccurrenceId { get; set; }
  public Question Question { get; set; }
}


All'interno del ciclo quindi puoi fare:
if (occuranceVal > 0)
{
  var questionOccurrences = new List<QuestionOccurrence>();
  var section = questionnaire.Sections.FirstOrDefault(s => s.Id == sectionID);
  for (int i = 1; i <= occuranceVal; i++)
  {
    foreach (var quest in section.Questions)
    {
      questionOccurrences.Add(new QuestionOccurrence { OccurrenceId = i, Question = quest});
    }
  }
  section.QuestionOccurrences.AddRange(questionOccurrences);
}


Sia la lista questionOccurrences che la section.QuestionOccurrences sono di tipo List<QuestionOccurrence>.
In questo modo, grazie alla nuova classe QuestionOccurrence, abbiamo modellato meglio il concetto di "slot" che si trova nella sezione di un questionario e che serve ad accogliere una delle domande presenti in anagrafica.

Personalmente, penso che nella classe QuestionOccurrence avrei messo una chiave composita formata da QuestionnareId, SectionId e OccurrenceId (forse l'avrei chiamato PositionId), in modo da persistere tutte le QuestionOccurrence in un'unica tabella senza rischio di conflitti tra le chiavi.

ciao,
Moreno
Modificato da BrightSoul il 13 marzo 2018 09.11 -

Enjoy learning and just keep making
252 messaggi dal 03 dicembre 2001
www.fuossbook.it
Grazie Moreno

in effetti l'oggetto doubleQuestions che avevo usato io é di tipo Question



 public class Question 
    {
        public Question()
        {
            Choices = new List<Choix>();
            ReglesValidation = new List<RegleValidation>();
        }
        public int Id { get; set; }
        public int Position { get; set; }
  public int Occurance { get; set; }
   public string Reponse { get; set; }

        public object ReponseObject{
        ...............
  ..............
  ..............



questo perchè poi nella view vado già a richiamare l'oggetto Question per mostrare le domande

***************************
webmaster di:
hydrasail.blogspot.it
fuossbook.it
***************************

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.