2010-07-13 105 views
0

我有2個列表,我想刪除第一個列表中的項目不存在於第二個列表中的項目。如何比較2個列表值?

public class ResolutionsRow 
{ 
    public String Name { get; set; } 
    public int ID { get; set; } 
} 

public List<ResolutionsRow> Categories { get; set; } 

在以下Category.LoadForProject(project.ID)返回一個IList

DeleteItems(Category.LoadForProject(project.ID), Categories); 

private void DeleteItems(dynamic currentItems, dynamic items) 
      { 
       if (currentItems != null) 
       { 
        foreach (var existingItem in currentItems) 
        { 
         if (items.Contains(existingItem.Name)) 
          items.Remove(existingItem.Name); 
        } 
       } 
      } 

我有錯誤消息

的最好的overlo 'System.Collections.Generic.List.Contains(MvcUI.Models.ResolutionsRow)'的匹配方法有一些無效的參數。我的代碼出了什麼問題,我該如何糾正它?請幫助。

我試圖改變代碼,但是我有錯誤消息

錯誤6參數1:不能從「INT」轉換爲API.Category」 MvcUI \模型\ ProjectModel。 CS 255 44 MvcUI 錯誤5的最好重載方法匹配 'System.Collections.Generic.ICollection.Contains(API.Category)' 具有一些無效參數MvcUI \模型\ ProjectModel.cs 255 24 MvcUI


var categories = Category.LoadForProject(project.ID); 
       foreach (var item in Categories) 
       { 
        if(categories.Contains(item.ID)) 
        { 

        } 
       } 

回答

1

變化

items.Contains(existingItem.Name); 

items.Remove(existingItem.Name); 

items.Contains(existingItem); 

items.Remove(existingItem); 
+0

它在達到這部分代碼之前失敗。 – learning 2010-07-13 11:54:18

+0

我仍然有錯誤消息 'System.Collections.Generic.List .Contains(MvcUI.Models.ResolutionsRow)'的最佳重載方法匹配有一些無效參數 – learning 2010-07-13 11:59:08

+0

在最後代碼示例在你編輯的答案中,將if(categories.Contains(item.ID))'改爲'if(categories.Contains(item))'。其他人發佈的基於LINQ的選項可能是更好的選擇,順便說一句。你有使用LINQ的問題嗎? – 2010-07-13 13:58:18

2

什麼是items?我猜這是ResolutionsRow的列表 - 因此您將需要搜索這個名稱/ ID,而不是名稱/ ID本身。

如果它們是同一個對象實例,那麼就Remove(existingItem)會的工作,但在其他方面(如果他們碰巧有相同.Name,不同對象實例):

items.RemoveAll(item => item.Name == existingItem.Name); 

的方式;你真的需要dynamic嗎?沒有它,編譯器會告訴你這個問題。它不會幫助你,並且很可能會導致很多問題(顯式接口實現,lambda等 - 存在的結構不是dynamic的風扇)

+0

dynamic items = Categories = List 類別它們不是相同實例的對象。他們都有.Name,但我仍然沒有理解爲什麼我有錯誤 – learning 2010-07-13 12:14:13

+0

user281180 - 因爲它*不是一個名稱列表*。它是*對象*的列表。您正在試圖使用接受「ResolutionsRow」的'Remove'方法來移除'string'。這是行不通的。 – 2010-07-13 12:33:58

0

您的items.Contains方法簽名期望的類型不同於你提供了什麼。看起來你提供了一個字符串而不是ResolutionsRow。

2

下面是簡單的LINQ答案:

var currentItems = new int[] { 1, 2, 5, 6 }; 
var items = new int[] { 2, 3, 4, 5 }; 

var resultItems = items.Except(currentItems); // resultItems == new int[] { 3, 4 } 
0

多久你這樣做,並在各列表中有多少個項目?你在做什麼通常被認爲是「設置操作」(聯合,交叉,減號等)。如果對上述任一問題的答案是「很多」,那麼你想考慮使用SortedSetHashSet

您當前的實現是O(m * n)(其中m和n是兩個列表的大小)。如果你使用散列集合,它是O(n),因爲只有第二個集合實際上是迭代的。構建集合也有成本(O(m + n)),但是如果您有足夠的對象或者可以將它用於不止一次操作,那麼它可以是值得的。