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