关于c#:删除一个IList中的项目<>

Remove items in one IList<> from another IList<>

本问题已经有最佳答案,请猛点这里访问。

很抱歉,我对Linq不熟悉,我想找出最好的方法来解决这个问题,只需在每个IList中循环。

我有2个带有自定义DTO对象的ILists<>。我要从列表中删除另一个列表中的所有匹配项。

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

我需要把list1中的所有项目从list2中删除。我一直在研究Except()方法,但显然我需要我的ItemsDTO类来重写GetHashCodeEquals方法,以便使其工作,但是我很难找到这方面的一些例子。

有人能告诉我把list1list2上取下来的最好方法吗?

再次感谢


您可能可以使用except方法来执行此操作。

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

如果要替换列表2,请执行以下操作:

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

来自MSDN:

To compare custom data types, implement the IEquatable generic
interface and provide your own GetHashCode and Equals methods for the
type. The default equality comparer, Default, is used to compare
values of types that implement IEquatable.


1
2
3
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

1
s => list1.Contains(s)

-A


"绝对是个好办法,"@jon skeet在下面回答一个类似的问题,会给你提供解决方案。

所以基本上,语法是:

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

使用LINQ从列表中删除元素

希望这有帮助。


它的意思是,您需要告诉.NET运行时如何确定一个类的两个实例是否相等(例如,它应该如何定义itemdto的一个实例是否等于itemdto的另一个实例)。

为此,重写等于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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,请参阅下面的链接了解更多信息。

请参见重载Equals和GetHashCode的指导原则