删除相同的List元素

时间:2016-06-29 13:38:11

标签: c# linq directory

我目前有两个目录信息列表。候选人名单& VersionList。 VersionList是候选列表的子列表。我试图删除版本列表中出现的候选列表中的所有元素。因此,如果canadidate列表有177个元素而版本列表有77个那么我们在候选列表中剩下100个元素。更清楚地了解列表中的内容。每个元素都与具有名称和父文件夹名称的目录文件夹名称相关。目录名称可能有重复但不同的父项。我试过这样做,但我没有必要得到正确的结果看看:

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

3 个答案:

答案 0 :(得分:1)

您当前的查询不会将业务要求限制为单个版本列表项。它分别制作了两个查询。它说:

  1. 是否存在名称与当前候选项目名称
  2. 匹配的任何versionList项目

    如果是:

    1. 是否存在Parent.Name与当前候选项目项Parent.Name
    2. 匹配的任何versionList项

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

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

      现在这样说:

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

答案 1 :(得分:1)

正如您所提到的,您要删除canadidate列表中显示的版本列表中的所有元素。我认为你的语法应该是:

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;

答案 2 :(得分:1)

您可以将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();       
    }
}