Учитывая следующий пример XML, мы могли бы представить схему, определяющую Root как содержащую последовательность несвязанного числа вариантов между Type1 и Type2.Сохранение порядка в последовательности выбора (LINQ To XSD)
<Root>
<Type1 />
<Type2 />
<Type2 />
<Type1 />
</Root>
Я тестируя миграцию из инструмента Xsd.exe который, хотя и добавляет безопасности типа имеет много маленьких раздражений. Инструмент XSD в этом случае просто создает внутри Root массив типа System.Object, и вам нужно выяснить, какие типы объектов (Type1 или Type2) находятся там. Это не совсем элегантно, но, по крайней мере, вы сохраняете порядок.
Проблема заключается в том, что LINQ to XSD создает объекты, он определяет Root как имеющий два независимых списка Type1 и Type2. Это здорово, поскольку он безопасен по типу, но теперь я теряю порядок элементов. Я построил LINQ для XSD из источника на codeplex.
Используя LINQ to XSD, как я могу сохранить порядок этих элементов?
Ну, вы уже представили только два варианта. Либо вы получаете слабо типизированную коллекцию, которая сохраняет заказ, либо вы получаете строго типизированную коллекцию для каждого типа. Представьте, что вы вообще не используете какой-либо XML - как бы вы написали объект с чистым кодом, который имеет единую строго типизированную коллекцию с несколькими типами в ней? –
Мой вопрос заключается в том, как сохранить порядок элементов в этом сценарии, используя Linq to XSD. Я понимаю, что для коллекции смешанных типов они должны быть из System.Object (или любого другого родителя, с которым они имеют общего). Я хочу отказаться от строго типизированных объектов в этом сценарии w/Linq для XSD, чтобы сохранить порядок. Я надеялся, что есть способ заставить его сделать это. В моем случае, порядок имеет значение, поэтому я не мог использовать Linq для XSD, хотя мне бы очень хотелось, поскольку у него много преимуществ по сравнению с XSD.exe. – Philip
Вы можете сделать это с наследованием. Если оба типа 1 и Type2 имеют общий базовый класс, у вас может быть IList. Теперь у вас есть один, строго типизированный список, и порядок сохраняется.При повторении через список просто проверьте тип текущего объекта. Еогеасп (BaseType эль в элементах) { если (эл является Type1) ... еще если (эл является Type2) ... } –