我目前有两个目录信息列表。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;
您当前的查询没有将业务需求限制为单个版本列表项。它分别进行两个查询。它说:
- 是否有任何版本列表项的名称与当前候选列表项名称匹配
是:
- 是否存在任何版本列表项,其中Parent。Name匹配当前候选列表项Parent。
如果是,则从候选列表中删除该项目。相反,您应该查询同时满足两个需求部分的versionList项。
candidateList.RemoveAll(x => versionslist.Any(y => y.Name == x.Name && y.Parent.Name == x.Parent.Name)); return candidateList;
现在的意思是:
是否存在
Name
和Parent.Name
分别与当前候选列表项Name
和Parent.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;