2016-03-30 51 views
-3

我試圖將每個列表的每個值與另一個列表的每個值進行比較,然後刪除任何匹配的值,並且目前有此代碼。從一個列表中刪除相等值的最有效方法

foreach (item s in List1) 
     { 
      for (int i = 0; i < list2.count; i++) 
      { 
       if (list2.ElementAt(i)==s) 
       { 
        list2.Remove(list2.ElementAt(i)); 
        continue; 
       }     
      } 
     } 

必須有一個更快,或者至少是一個不太密集的方法來執行這樣的比較。需要更快的方法,因爲這可以用來比較每個超過1000個值的列表。任何幫助將大大降低

+0

實際上,要求是從'list1'中存在的'list2'中刪除元素,不是嗎? –

+0

As @ un-lucky指出有更好的方法來做你可能需要的東西......爲了讓你的代碼更快(而不是更好,因爲在.NEt中有現成的方法來做到這一點) - 使用字典來加快搜索速度。可能是http://stackoverflow.com/questions/5636438/difference-between-two-lists的重複。您可能需要閱讀[設置操作](https://msdn.microsoft.com/en-us/library/bb546153.aspx)以改善問題。 –

+0

使用LINQ查詢.. – JamieD77

回答

0

要刪除list1中包含的list2中的所有元素。一種有效的方法是創建一個HashSet,其中包含對list1中每個對象的引用,因爲針對HashSet的查找速度非常快。然後遍歷list2中的每個元素,但以相反的順序。這很重要,因爲您將刪除元素。嘗試是這樣的:

List<MyObjType> list1 = new List<MyObjType>(); 
List<MyObjType> list2 = new List<MyObjType>(); 

HashSet<MyObjType> list1Hashset = new HashSet<MyObjType>(list1); 
for (int i = list2.Count - 1; i >= 0; i--) 
{ 
    if (list1Hashset.Contains(list2[i])) 
     list2.RemoveAt(i); 
} 
1

使用Except,它通過使用默認相等比較產生兩個序列的差異。

除擴展方法使用HashSet<T>,它在LookUp中產生O(1)訪問權限。

list2 = list2.Except(list1).ToList(); 
相關問題