Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解决C#集合不匹配问题_C#_Linq_Loops_Foreach_Linq To Xml - Fatal编程技术网

解决C#集合不匹配问题

解决C#集合不匹配问题,c#,linq,loops,foreach,linq-to-xml,C#,Linq,Loops,Foreach,Linq To Xml,我有两个系列-一个包含产品名称-第二个包含装运信息。检索此信息的方式确保每个集合中的每个位置都在一起,即集合1中的位置[0]与集合2中的位置[0]在一起。但是,每当同一位客户订购两个或更多不同的商品时,这种情况就不再存在了——这会在我的收藏中造成不匹配 在下面的示例中,同一位客户dave lain订购了两种不同的物品,在我的“b”系列中添加了两种不同的药剂,但他只会在我的“a”系列中添加一种药剂。当我去迭代这两个集合时,它们将无法正确匹配,错误的人将被记入错误的顺序 产品标题集合“b”的XML文

我有两个系列-一个包含产品名称-第二个包含装运信息。检索此信息的方式确保每个集合中的每个位置都在一起,即集合1中的位置[0]与集合2中的位置[0]在一起。但是,每当同一位客户订购两个或更多不同的商品时,这种情况就不再存在了——这会在我的收藏中造成不匹配

在下面的示例中,同一位客户dave lain订购了两种不同的物品,在我的“b”系列中添加了两种不同的药剂,但他只会在我的“a”系列中添加一种药剂。当我去迭代这两个集合时,它们将无法正确匹配,错误的人将被记入错误的顺序

产品标题集合“b”的XML文件:

<ListOrderItems>
    <OrderItem>
        <Title>ItemfromCustomer1</Title>
    </OrderItem>
    <OrderItem>
        <Title>ItemfromCustomer1</Title>
    </OrderItem>
    <OrderItem>
        <Title>ItemfromCustomer2</Title>
    </OrderItem>
    <OrderItem>
        <Title>ItemfromCustomer3</Title>
    </OrderItem>
</ListOrderItems>

由于您的示例没有提供强制执行
Order
元素和
OrderItem
元素之间关系的某种键的任何信息,因此我将假定
Title
是语义键

方法

合并元素,直到到达其中一个序列的末尾

就像你的例子一样

[…]如果一个序列有三个元素,而另一个序列有四个元素,则结果序列只有三个元素

因此,实际发生的是,第二步中的
Zip
方法将来自Customer1的
OrderItem
Item与序列JOE SCHMO中的第二个
Order
元素相关联

您需要做的是将
OrderItem
s分组,然后按如下方式展平集合:

addresses.Descendants("Order")
    .Zip(orders.Descendants("OrderItem")
                .GroupBy(e=>e.Element("Title").Value), 
            (a, o) => new{a,o})
    .SelectMany(tuple => tuple.o.Select(x => new{tuple.a, o = x}));
addresses.Descendants("Order")
    .Join(orders.Descendants("OrderItem"),
        order => order.Element("Id").Value,
        orderItem => orderItem.Element("OrderId").Value,
        (order, orderItem) => new{order, orderItem});
这是LINQPad中的结果:

但是,请记住,这不是正确的方法 您需要定义由某种外键强制执行的
Order
元素和
OrderItem
元素之间的关系,以便可以在这些集合上执行适当的排序,而不必考虑排序问题;大概是这样的:

addresses.Descendants("Order")
    .Zip(orders.Descendants("OrderItem")
                .GroupBy(e=>e.Element("Title").Value), 
            (a, o) => new{a,o})
    .SelectMany(tuple => tuple.o.Select(x => new{tuple.a, o = x}));
addresses.Descendants("Order")
    .Join(orders.Descendants("OrderItem"),
        order => order.Element("Id").Value,
        orderItem => orderItem.Element("OrderId").Value,
        (order, orderItem) => new{order, orderItem});

“一切都结束了”你这到底是什么意思?此外,您是否可以只发布与问题相关的代码部分,而不是所有数据和源代码?@HimBromBeere一切都变得不正常,例如,集合“a”中位置[2]的客户名称与他/她为集合“b”中位置[2]订购的产品不再匹配。所有产品名称-发货信息因集合中的一个位置而变得混乱。@dannytaki-请查看您的示例数据/代码,并与您的描述进行比较,因为它们在一起没有意义?代码中有一些属性不在数据中。您的示例“dave lain”没有显示任何订单项。请修正你的问题。