【问题标题】:How to merge data in columns in linq如何在linq中合并列中的数据
【发布时间】:2011-02-02 12:42:18
【问题描述】:

我有一个xml格式的源数据,比如;

    <plans>
    <plan>
        <id>1</id>
        <name>Test1</name>
        <description>Description for test 1</description>
    </plan>
    <plan>
        <id>2</id>
        <name>Test2</name>
        <description>Description for test 2</description>
    </plan>
    <plan>
        <id>3</id>
        <name>Test3</name>
        <description>Description for test 3</description>
    </plan>
   </plans>

我有详细的数据,也是 xml 格式的;

    <plandetails>
    <detail>
        <planid>1</planid>
        <properties>
            <propery>
                <name>Pname1</name>
                <value>Test1Property1</value>
                <name>Pname2</name>
                <value>Test1Property2</value>
                <name>Pname3</name>
                <value>Test1Property3</value>
            </propery>
        </properties>
    </detail>
    <detail>
        <planid>2</planid>
        <properties>
            <propery>
                <name>Pname1</name>
                <value>Test2Property1</value>
                <name>Pname2</name>
                <value>Test2Property2</value>
                <name>Pname3</name>
                <value>Test2Property3</value>
            </propery>
        </properties>
    </detail>
    <detail>
        <planid>3</planid>
        <properties>
            <propery>
                <name>Pname1</name>
                <value>Test3Property1</value>
                <name>Pname2</name>
                <value>Test3Property2</value>
                <name>Pname3</name>
                <value>Test3Property3</value>
            </propery>
        </properties>
    </detail>   
</plandetails>

我正在尝试获得类似的结果;

Name           Test1                   Test2                    Test3                   ....  Test n
Description Description for test 1  Description for test 2   Description for test 3  ....  Description for test n
Pname1       Test1Property1          Test2Property1           Test3Property1          ....  TestnProperty1
Pname2       Test1Property2          Test2Property2           Test3Property2          ....  TestnProperty2
Pname3       Test1Property3          Test2Property3           Test3Property3          ....  TestnProperty3
.
.
.
.

如何使用 LINQ 实现这一点?

提前致谢。

【问题讨论】:

  • 您似乎在寻找像支点这样的东西?

标签: xml linq merge


【解决方案1】:

取决于语言。在 C# 中,这看起来像是 Zip() 或类似的工作。但是你必须先从 XML 中取出数据。

【讨论】:

    【解决方案2】:

    我将数据合并到一个可管理的结构中,但您需要格式化输出。

    这里真的没有什么特别的。我只是使用 linq 加入 plan.id == detail.planid 并将结果保存在一个匿名对象中。

    var xmaster = XElement.Parse(
        @"<plans>
        <plan>
            <id>1</id>
            <name>Test1</name>
            <description>Description for test 1</description>
        </plan>
        <plan>
            <id>2</id>
            <name>Test2</name>
            <description>Description for test 2</description>
        </plan>
        <plan>
            <id>3</id>
            <name>Test3</name>
            <description>Description for test 3</description>
        </plan>
        </plans>");
    
    var xdetail = XElement.Parse(
        @"<plandetails>
            <detail>
                <planid>1</planid>
                <properties>
                    <propery>
                        <name>Pname1</name>
                        <value>Test1Property1</value>
                        <name>Pname2</name>
                        <value>Test1Property2</value>
                        <name>Pname3</name>
                        <value>Test1Property3</value>
                    </propery>
                </properties>
            </detail>
            <detail>
                <planid>2</planid>
                <properties>
                    <propery>
                        <name>Pname1</name>
                        <value>Test2Property1</value>
                        <name>Pname2</name>
                        <value>Test2Property2</value>
                        <name>Pname3</name>
                        <value>Test2Property3</value>
                    </propery>
                </properties>
            </detail>
            <detail>
                <planid>3</planid>
                <properties>
                    <propery>
                        <name>Pname1</name>
                        <value>Test3Property1</value>
                        <name>Pname2</name>
                        <value>Test3Property2</value>
                        <name>Pname3</name>
                        <value>Test3Property3</value>
                    </propery>
                </properties>
            </detail>   
        </plandetails>");
    
    var merged = from m in xmaster.Descendants("plan")
                join d in xdetail.Descendants("detail")
                    on (int)m.Element("id") equals (int)d.Element("planid")
                select new
                {
                    Name = m.Element("name").Value,
                    Description = m.Element("description").Value,
                    Pnames = d.Descendants("propery").Elements().Where(n => n.Name == "value").Select(v => v.Value)
                };
    

    【讨论】:

    • 感谢 philip,但我正在寻找旋转您的结果。我们如何调整它?
    • 我已经成功使用了这种扩展方法。 extensionmethod.net/Details.aspx?ID=147 试试看。明天我会回头看看你是否得到它或其他人是否回答。明天我会有更多时间帮忙。 :)
    • 我花了大约 1/2 小时试图获得你想要的输出,但无法让它完全像你拥有的那样输出。
    • 我花了 2 天时间,但也没有运气。无论如何感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2010-10-02
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多