按顺序保留顺序(LINQ To XSD)

Phi*_*lip 7 c# linq xsd xsd.exe linq-to-xsd

给定以下XML示例,我们可以想象一个模式将Root定义为包含Type1和Type2之间的未绑定数量的选择序列.

<Root>
    <Type1 />
    <Type2 />
    <Type2 />
    <Type1 />
</Root>
Run Code Online (Sandbox Code Playgroud)

我正在测试从XSD.exe工具迁移,虽然添加类型安全有很多小烦恼.在这种情况下,XSD工具只是在Root中创建一个System.Object类型的数组,你必须弄清楚那里有什么类型的对象(Type1或Type2).它并不完全优雅,但至少你保留了秩序.

问题是当LINQ to XSD创建对象时,它将Root定义为具有两个独立的Type1和Type2列表.这很棒,因为它是类型安全的,但我现在似乎失去了元素的顺序.我在codeplex上从源代码构建了LINQ to XSD.

使用LINQ to XSD,我如何保留这些元素的顺序?

Sil*_*nix 2

如何围绕 Choice 创建一个包装器?限制它访问的类型,如下所示:

class Choice
{
    private object _value;

    public ChoiceEnum CurrentType { get; private set; }

    public Type1 Type1Value
    {
        get { return (Type1) _value; }
        set { _value = value; CurrentType = ChoiceEnum.Type1; }
    }

    public Type2 Type2Value
    {
        get { return (Type2) _value; }
        set { _value = value; CurrentType = ChoiceEnum.Type2; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个简化版本,您将必须添加更多验证(如果_value类型正确,当前类型是什么_value,等等)。

然后,您可以使用 LINQ 对其进行过滤:

var q1 = from v in root.Sequence
         where v.CurrentType == ChoiceEnum.Type1
         select v.Type1;
Run Code Online (Sandbox Code Playgroud)

或者您可以在 Root 中创建方法来包装查询。