2011-04-08 176 views
1

列表A和列表比较两个列表

List A = new List(); List B = new List();

为了简单起见,我已经提到了每个列表中的产品。这里的数字是指产品ID。

List A contains 1,2,3,4,5 

    List B contains 1,2,3,4,5,6,7 

我想知道c#asp.net中的代码,它将比较两个列表并对它们进行同步。意思是如果列表B有一些更多的产品(可以说19,20)它复制19,20列表A.

可以说这是一个列表,我将如何比较数量属性。我必须检查两个列表中是否有相同的产品ID。然后它会检查数量属性。它会同步它们两个。

+0

您的修改已完全改变的问题!如果列表A中包含'{Id = 1,Qty = 10}'的产品,而列表B中包含'{Id = 1,Qty = 5}'的产品,那么“同步它们两个”是什么意思。什么会被同步? – 2011-04-08 10:34:02

+0

为编辑的问题提供一个更好的示例。我不确定我是否明白你想要完成什么。 – SWeko 2011-04-08 10:39:51

+0

实际上,我正在购物车的会话与数据库中的购物车项目之间进行同步。我首先加载数据库的结果并将其保存到会话.....然后在用户注销后...我想将会话保存到db – user478636 2011-04-08 12:38:22

回答

2

不知道这是否是最有效的解决方案(我敢肯定,必须有这更好的LINQ的方法)...

c = A.Except(B).Union(B.Except(A)).ToList(); 
+1

但是,当您在自定义对象列表上使用这种方法时要小心。这些使用默认的比较器(反过来使用'Equals'方法(默认情况下执行'ReferenceEquals'))来确定两个元素是否正确。如果你的类中有一些自定义的相等代码,也就是说,如果两个产品具有相同的ProductID等,那么对于愚蠢的边缘情况尽可能地测试这种类型的代码是很好的。 – SWeko 2011-04-08 10:38:18

+0

是的,公正的评论 - 用'int'这很好,但对于Product类可能不是。也就是说,这个问题现在已经完全改变了,所以谁知道真正的答案可能是...... – 2011-04-08 10:39:55

2
List<T> result = firstList.Except(secondList).ToList() 

而且你可能需要在你的类实现一个EqualityComparer<T>,以确保您的对象平等。

+1

'除了'会返回第一个不在第二个(从给出的例子不清楚是否需要相交或除外) – SWeko 2011-04-08 10:30:25

+0

@Sekeko:从例子4和5中得到的数字应该是可以返回的,这就是A中不在B中的所有东西。所以'Except '是正确的答案。 – 2011-04-08 10:32:22

+0

@Sekeko:打我吧!我的回答考虑到了这一点,但我确信必须有一个更清洁的方式...... – 2011-04-08 10:32:34