删除相同的List元素

本文关键字:List 元素 删除 | 更新日期: 2023-09-27 17:53:14

我目前有两个目录信息列表。Candidatelist,VersionList。VersionList是候选列表的子列表。我试图从候选列表中删除出现在版本列表中的所有元素。因此,如果加拿大日期列表有177个元素,版本列表有77个元素,那么候选列表中还剩下100个元素。为了更明确地了解列表中的内容。每个元素对应于一个目录文件夹名,该目录文件夹名有一个名称和一个父文件夹名。目录名可能有重复但不同的父目录。我试着这样做,但我不一定得到正确的结果看看:

candidateList.RemoveAll(x => versionslist.Any(y => y.Name == x.Name) && versionslist.Any(y => y.Parent.Name == x.Parent.Name));
      return candidateList;

删除相同的List元素

您当前的查询没有将业务需求限制为单个版本列表项。它分别进行两个查询。它说:

  1. 是否有任何版本列表项的名称与当前候选列表项名称匹配

是:

  • 是否存在任何版本列表项,其中Parent。Name匹配当前候选列表项Parent。

    如果是,则从候选列表中删除该项目。相反,您应该查询同时满足两个需求部分的versionList项。

    candidateList.RemoveAll(x => versionslist.Any(y => y.Name == x.Name && y.Parent.Name == x.Parent.Name));
      return candidateList;
    

    现在的意思是:

    是否存在NameParent.Name分别与当前候选列表项NameParent.Name匹配的versionList项

  • 你可以使用IEnumerable.Except()方法自定义IEqualityComparer:

    var differences = candidateList.Except(versionList, new DirectoryInfoComparer());    
    

    EqualityComparer可以像这样:

    public class DirectoryInfoComparer : IEqualityComparer<DirectoryInfo>   
    {
        bool IEqualityComparer<DirectoryInfo>.Equals(DirectoryInfo x, DirectoryInfo y)
        {            
            return (x.Name == y.Name) && (x.Parent.Name == y.Parent.Name);        
        }
        int IEqualityComparer<DirectoryInfo>.GetHashCode(DirectoryInfo obj)
        {
            if (Object.ReferenceEquals(obj, null))
                return 0;               
            return obj.GetHashCode();       
        }
    }
    

    如前所述,您希望从版本列表中删除出现在加拿大日期列表中的所有元素。我认为你的语法应该像这样:

    VersionList.RemoveAll(x => candidateList.Any(y => y.Name == x.Name && y.Parent.Name == x.Parent.Name);
          return VersionList;
    

    反之,则使用

     candidateList.RemoveAll(x => VersionList.Any(y => y.Name == x.Name && y.Parent.Name == x.Parent.Name);
              return candidateList;
    
    相关文章: