LINQ:比较两个列表的名称(字符串)和 return List<object> 而不是 list<string>

LINQ: Compare names (string) of two lists and return List<object> instead of list<string>

我正在比较两个列表,以找出其中一个列表中缺少的列表。 我找到了关于此的其他文章,但我找不到任何使用 属性 比较的文章,但是 returning 'the whole object'.

到目前为止我有:

return xmlFilesProduction
                .Select(i => i.Name).ToList()
                .Except(xmlFilesRepository
                .Select(x => x.Path.Replace(gitFilePath, ""))).ToArray();

对于 xmlFilesRepository,我首先需要操作路径,以获取文件名。

到目前为止,它工作得很好,但是,我不想 return 一个包含名称的列表,而是一个包含整个对象 (FileInfo) 的列表。 否则,我需要再次遍历 xmlFilesProduction。

这可能吗?我是否正确处理了上面的代码(关于一个 LINQ 查询中的 O(n*m) 和各种 select 语句)?

提前致谢!

尝试这样的事情:

var repoFileNames = xmlFilesRepository
   .Select(x => x.Path.Replace(gitFilePath, string.Empty))
   .ToHashSet();

return xmlFilesProduction.Where(i => !repoFileNames.Contains(i.Name)).ToArray();

这会将您“存储库”中的所有文件名放入 HashSet<string> using the ToHashSet() extension methodHashSet<T> 非常适合在恒定时间内检查集合成员资格。那么只需要使用 .Where() 而不是 .Except() 来过滤掉在 repoFileNames 集合中找到 Name 的“生产文件”。