2011-04-08 175 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