Dato il seguente esempio XML, possiamo immaginare uno schema che definisce Root come contenente una sequenza di numero illimitato di scelte tra Tipo1 e Tipo2.Ordine di conservazione in sequenza di scelte (da LINQ a XSD)
<Root>
<Type1 />
<Type2 />
<Type2 />
<Type1 />
</Root>
sto testando fuori la migrazione dallo strumento XSD.exe che anche se aggiunge tipo di sicurezza ha un sacco di piccoli fastidi. Lo strumento XSD in questo caso crea semplicemente all'interno di Root un array di tipo System.Object e devi capire quale tipo di oggetti (Tipo1 o Tipo2) ci sono dentro. Non è completamente elegante, ma almeno preservi l'ordine.
Il problema è quando LINQ a XSD crea gli oggetti, definisce Root come dotato di due elenchi indipendenti di Tipo1 e Tipo2. Questo è fantastico in quanto è sicuro per i tipi, ma ora sembra che perda l'ordine degli elementi. Ho sviluppato LINQ to XSD dall'origine su codeplex.
Utilizzando LINQ to XSD, come posso mantenere l'ordine di questi elementi?
Bene, hai già presentato le uniche due opzioni. O ottieni una raccolta debolmente tipizzata che conserva l'ordine o ottieni una raccolta fortemente tipizzata per tipo. Fai finta di non utilizzare affatto XML - come scriveresti un oggetto di puro codice che ha una singola raccolta fortemente tipizzata con più tipi al suo interno? –
La mia domanda è come conservare l'ordine degli elementi in questo scenario usando Linq a XSD. Mi rendo conto di avere una collezione di tipi misti che dovrebbero essere di System.Object (o qualsiasi genitore che hanno in comune). Sono disposto a rinunciare a oggetti fortemente tipizzati in questo scenario w/Linq a XSD per preservare l'ordine. Speravo ci fosse un modo per costringerlo a farlo. Nel mio caso d'uso, l'ordine è importante, quindi non potrei usare Linq per XSD, anche se mi piacerebbe molto visto che ha molti vantaggi rispetto a XSD.exe – Philip
Puoi farlo con l'ereditarietà. Se sia Type1 che Type2 avevano una classe base comune, potresti avere un IList. Ora hai una singola lista fortemente tipizzata e l'ordine è preservato.Quando si scorre l'elenco, è sufficiente controllare il tipo dell'oggetto corrente. foreach (BaseType el negli elementi) { se (el è Type1) ... else if (el è tipo2) ...} –