2011-05-02 48 views
5

這可能是一個常見問題,而且我沒有找到可行的解決方案來搜索其他問題(注意,我的C#和linq技能是有限的 - 所以一個簡單的解決方案將不勝感激!)。C#比較兩個列表,返回列表2中的新項目

這裏是問題

我有2列出了使用對象。我想比較它們並返回list2中的所有NEW對象。

實施例:

鏈表類的List1; //包含存儲在數據庫中的3個對象

ObjectList List2; //包含與List1中相同的3個對象以及從網頁添加的新對象(父對象已在網頁上更新)

ObjectList List3; //應該做一個比較列表1和列表2,並在列表2返回新的對象(所以結果應該只是對象數量4)

注:

  • 的順序並不重要。我只想要新對象
  • 通常,對象只能添加到List2中。如果任何對象被刪除(與List1比較),那麼這應該被忽略。 (這樣的對象,只有List1中存在不感興趣)

感謝您的任何建議或鏈接到以前的問題,我錯過了我的搜索

編輯

這裏是一個小例子首先嚐試使用Except(返回錯誤)

我縮短了一下。該方法來自我們的軟件,所以他們很可能不知道給你。對於那個很抱歉。

// caDialogObjects = List1 (caDialogQLMLinks is the link to the objects) 
RepositoryObjectList caDialogObjects = args.Object.GetConfiguration().GetObjectSet(caDialogQLMLinks); 

// caObjectObjects = List2 (caObjectQLMLinks is the link to the objects) 
RepositoryObjectList caObjectObjects = args.Object.GetConfiguration().GetObjectSet(caObjectQLMLinks); 

// List 3 
RepositoryObjectList caTotal; 
caTotal = caObjectObjects.Except(caDialogObjects); 

解決方案奏效 例外沒有工作,因爲這份名單只是一個參考(不是值)。它可以使用第二個參數,但我得到了工作了LINQ代碼:

RepositoryObjectList caNewCA = 
    new RepositoryObjectList(caDialogObjects.Where(item1 => 
     !caObjectObjects.Any(item2 => item1.Id == item2.Id))); 

回答

14

使用此:

var list3 = list2.Except(list1); 

這將使用它返回的所有元素在list2不屬於Except擴展方法在list1
重要的是要注意,Except返回IEnumerable<T>其中Tlist1list2中的對象的類型。
如果您需要您的list3爲特定類型,則需要轉換該返回值。在最簡單的情況下,你的目標類型有一個構造函數,可以處理和IEnumerable<T>

RepositoryObjectList list3 = new RepositoryObjectList(list2.Except(list1)); 
+0

我喜歡這個比我的好:) – iain 2011-05-02 12:41:17

+0

這也將是很好的提[除過載(http://msdn.microsoft.com/en-us/library/system.linq。 enumerable.except.aspx),它使用'IEqualityComparer'實例來比較元素。 – Groo 2011-05-02 12:43:17

+0

嗨daniel.Thank你的答案。這實際上是我嘗試的解決方案之一。但是我得到錯誤「CAn不隱式轉換類型」RepositoryObject「tog」RepositoryObjectList「,這兩種類型都來自我們的軟件,但所有3個列表被聲明爲」RepositoryObjectList「 – Kim 2011-05-02 12:43:28

4
List<MyObject> objectList1 = new List<MyObject>(); 
    List<MyObject> objectList2 = new List<MyObject>(); 
    List<MyObject> objectList3 = objectList2.Where(o => !objectList1.Contains(o)).ToList(); 

這應該這樣做,只要爲MyObject是IComparable

http://msdn.microsoft.com/en-us/library/system.icomparable.aspx

+0

+1對於具有引用類型列表(而不是簡單值類型)以及提及IComparable的示例。我發現幾乎所有我使用的列表都是複雜的引用類型,因此我懷疑只涉及值類型的解決方案。 – 2016-06-19 22:23:10

2

下面是一個例子如何使用LINQ做到這一點:

List<int> l1 = new List<int>(); 
List<int> l2 = new List<int>(); 

l1.AddRange(new int[] {1, 2, 3, 5}); 
l2.AddRange(new int[] {1, 2, 3, 4}); 

// get only the objects that are in l2, but not l1 
var l3 = l2.Except(l1); 

第三列表將只包含一個元件,4.

1
secondList.Except(firstList) 

其使用

public static IEnumerable<TSource> Except<TSource>(
    this IEnumerable<TSource> first, 
    IEnumerable<TSource> second 
) 

http://msdn.microsoft.com/en-us/library/bb300779.aspx

secondList.Except(firstList,new CustomComparer()) 

其使用

public static IEnumerable<TSource> Except<TSource>(
    this IEnumerable<TSource> first, 
    IEnumerable<TSource> second, 
    IEqualityComparer<TSource> comparer 
) 

http://msdn.microsoft.com/en-us/library/bb336390.aspx