2012-02-15 60 views
7

從一個IList <>中刪除項目。很抱歉發佈了這樣的基本問題,我是LINQ的新手,我正試圖找出最好的方法來完成每個IList的循環。從另一個IList <>

我有2 ILists<>自定義dto對象。我想從列表中刪除所有匹配的項目。

IList<ItemDTO> list1 = itemsbl.GetBestItems(); 
IList<ItemDTO> list2 = itemsbl.GetWorstItems(); 

我需要從list2刪除list1所有項目。我一直在尋找Except()方法,但顯然我需要我的ItemsDTO類來覆蓋GetHashCodeEquals方法的工作,但我無法找到這樣的一些例子。

有人請告訴我從list2刪除list1的最好方法嗎?

再次感謝

回答

9

您或許可以使用Except方法來做到這一點。

var newList = list2.Except(list1).ToList(); 

如果要替換列表2則只是這樣做:

list2 = list2.Except(list1).ToList(); 

從MSDN:

比較自定義數據類型,實現IEquatable通用 接口,並提供自己的GetHashCode和Equals方法的 類型。默認的相等比較器默認值用於比較實現IEquatable的類型的 值。

+0

謝謝你,我結束了相應的修改我的班,這樣我可以我們除了()...謝謝大家,我敢肯定,所有其他解決方案都一樣好...: ) – Nugs 2012-02-16 19:49:25

1

哈希絕對的好辦法,@喬恩飛碟雙向下面的回答類似的問題會爲您提供解決方案。

所以基本語法是:

var setToRemove = new HashSet<ItemDTO>(list1); 
list2.RemoveAll(x => setToRemove.Contains(x)); 

Using LINQ to remove elements from a List<T>

希望這可以幫助。

+0

我不知道爲什麼,但RemoveAll()不適合我... – Nugs 2012-02-15 23:32:44

+3

IList是List implements的接口.IList用於其他集合類。 List類包含IList中未定義的方法。因此,通過將您的原始列表對象分配給IList,您將不再有權訪問任何List的唯一方法。除非你有使用IList 的理由,否則我建議使用列表。 MSDN:http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx – Nickz 2012-02-15 23:36:09

1
var list1 = new List<string> { "A", "B", "C" }; 
var list2 = new List<string> { "A", "C", "E", "B", "D", "G", "F" }; 
list2.RemoveAll(list1.Contains); 

也會起作用。請注意,list1.Contains實際上是一個lambda

s => list1.Contains(s) 

-A。

+0

我不知道爲什麼,但RemoveAll()不適合我... – Nugs 2012-02-15 23:25:02

+0

'list.Contains'實際上並不是拉姆達。雖然它在這裏表現相同。 – svick 2012-02-16 01:01:59

+1

我提到過,因爲我認爲RemoveAll接受謂詞很重要,特別是因爲OP的對象可能沒有實現相等/比較。 – Ani 2012-02-16 04:56:55

0

它的意思是,你需要告訴.NET運行時如何確定一個類的兩個實例是否相等(例如,應該如何界定ItemDTO的一個實例是否等於ItemDTO的另一個實例)。

要做到這一點,忽略equals

public class ItemDTO 
{ 
    public override bool Equals(object obj) 
    { 
     var otherItem = obj as ItemDTO; 

     if (otherItem == null) 
     { 
      // this will be because either 'obj' is null or it is not of type ItemDTO. 
      return false; 
     } 

     return otherItem.SomeProperty == this.SomeProperty 
       && otherItem.OtherProperty == this.OtherProperty; 
    } 
} 

如果你不這樣做,只會在列表中刪除其指向同一物理實例作爲其他任何引用。然後,您可以使用Except或RemoveAll方法或您決定使用的其他方法。

您還需要重寫GetHashcode,請參閱下面的鏈接瞭解更多信息。

Guidelines for Overloading Equals and GetHashcode

相關問題