2012-02-15 100 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

相关问题