我目前有两个目录信息列表。候选人名单& 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;
答案 0 :(得分:1)
您当前的查询不会将业务要求限制为单个版本列表项。它分别制作了两个查询。它说:
如果是:
如果是,请从候选列表中删除该项目。相反,您应该查询同时满足两个需求部分的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项目。
答案 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();
}
}