Biorąc pod uwagę następujący przykład XML, moglibyśmy wyobrazić sobie schemat definiujący Root jako zawierający sekwencję niezwiązanej liczby opcji między Type1 i Type2.Zachowywanie porządku w kolejności sekwencji (LINQ do XSD)
<Root>
<Type1 />
<Type2 />
<Type2 />
<Type1 />
</Root>
Przeprowadzam testowanie migracji z narzędzia XSD.exe, które jednak dodaje bezpieczeństwa typu ma wiele małych uciążliwości. Narzędzie XSD w tym przypadku tworzy wewnątrz Root tablicę typu System.Object i musisz dowiedzieć się, jakie typy obiektów (Type1 lub Type2) tam są. Nie jest całkowicie elegancka, ale przynajmniej zachowujesz porządek.
Problem polega na tym, że gdy LINQ do XSD tworzy obiekty, definiuje Root jako dwie niezależne listy typu 1 i Typ2. Jest to wspaniałe, ponieważ jest bezpieczne dla typu, ale wydaje mi się, że traci kolejność elementów. Zbudowałem LINQ do XSD ze źródła na codeplex.
Używając LINQ do XSD, w jaki sposób mogę zachować kolejność tych elementów?
Cóż, już przedstawiłeś tylko dwie opcje. Albo otrzymujesz słabo wpisaną kolekcję, która zachowuje porządek, albo dostajesz silnie typowaną kolekcję według typu. Udawaj, że w ogóle nie korzystasz z żadnego XML-a - w jaki sposób napiszesz obiekt czystego kodu, który ma jedną silnie wpisaną kolekcję z wieloma typami? –
Moje pytanie brzmi: jak zachować kolejność elementów w tym scenariuszu, używając Linq do XSD. Zdaję sobie sprawę, że mam zbiór typów mieszanych, które powinny być w System.Object (lub czymkolwiek innym, który mają ze sobą wspólnego). Jestem gotów zrezygnować z silnie typowanych obiektów w tym scenariuszu z Linq do XSD, aby zachować porządek. Miałem nadzieję, że istnieje sposób, aby to zmusić. W moim przypadku użycia, zamówienie ma znaczenie, więc nie mogłem używać Linq do XSD, chociaż naprawdę chciałbym, ponieważ ma wiele zalet w porównaniu z XSD.exe. – Philip
Możesz to zrobić z dziedziczeniem. Jeśli oba typy Type1 i Type2 mają wspólną klasę podstawową, możesz mieć IList. Teraz masz jedną, silnie wpisaną listę, a zamówienie jest zachowane.Podczas powtarzania listy, po prostu sprawdź typ bieżącego obiektu. foreach (BaseType el w elementach) { if (el jest Type1) ... else if (el jest Type2) ... } –