如果Contains返回true,则提取列表中的项目

Mat*_*att 1 c# contains list

我有两个列表A和B,在我的程序开始时,它们都填充了数据库中的信息(列表A =列表B).我的程序运行,使用和修改列表A,列表B保持不变.过了一会儿,我用数据库中的新信息重新加载List B,然后对List A进行检查.

foreach (CPlayer player in ListA)
      if (ListB.Contains(player))
            -----
Run Code Online (Sandbox Code Playgroud)

首先,对象播放器是从类创建的,其主要标识符是player.Name.如果Name是相同的,但其他变量不同,.Contains是否仍会返回true?

Class CPlayer(
      public CPlayer (string name)
              _Name = name
Run Code Online (Sandbox Code Playgroud)

在----我需要使用ListB中的项目导致.Contains返回true,我该怎么做?

Mar*_*ers 5

默认行为List.Contains是它使用默认的相等比较器.如果您的项目是引用类型,这意味着它将使用身份比较,除非您的类通过提供另一个实现Equals.

如果您使用的是.NET 3.5,那么您可以将第二行更改为可以执行您想要的操作:

if (ListB.Any(x => x.Name == player.Name))
Run Code Online (Sandbox Code Playgroud)

对于.NET 2.0,你可以实现EqualsGetHashCode为您的类,但是这可能在你不想要两个球员要比较的对象相等如果他们有相同的名字,但在其他领域不同,其他情况下给予不良行为.

另一种方法是调整Jon Skeet对.NET 2.0 的回答.创建一个Dictionary<string, object>并用listB中所有玩家的名字填充它.然后测试具有特定名称的玩家是否在listB中可以使用dict.ContainsKey(name).