C# LINQ:比较两个列表和返回列表的名称(字符串)<;对象>;而不是列表<;字符串>;

C# LINQ:比较两个列表和返回列表的名称(字符串)<;对象>;而不是列表<;字符串>;,c#,.net,linq,except,C#,.net,Linq,Except,我正在比较两个列表,以找到其中一个列表中缺少的列表。 我已经找到了其他关于这方面的文章,但是我没有找到任何使用属性比较的文章,而是返回“整个对象” 到目前为止,我已经: return xmlFilesProduction .Select(i => i.Name).ToList() .Except(xmlFilesRepository .Select(x => x.Path.Replace(

我正在比较两个列表,以找到其中一个列表中缺少的列表。 我已经找到了其他关于这方面的文章,但是我没有找到任何使用属性比较的文章,而是返回“整个对象”

到目前为止,我已经:

return xmlFilesProduction
                .Select(i => i.Name).ToList()
                .Except(xmlFilesRepository
                .Select(x => x.Path.Replace(gitFilePath, ""))).ToArray();
对于xmlFilesRepository,我首先需要操作路径,以获取文件名

到目前为止,它还可以正常工作,但是,我不想返回一个包含名称的列表,而是返回一个包含整个对象(FileInfo)的列表。 否则,我需要再次循环XMLFiles产品

这可能吗?我是否正确地处理了上面的代码(关于一个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
非常适合在固定时间内检查集合成员资格。然后,只需使用
.Where()
而不是
.Except()
来筛选出
名称
位于
repoFileNames
集中的“生产文件”。

甚至
.ToHashSet()
就可以完全进入LINQ。@JohnathanBarclay更好!更新。太好了,这工作顺利!那么,就性能而言,这也是一个不错的选择?例如,XMLFileRepository包含大约5000个文件。我最近听说了O(n*m)的概念,但这对我来说还是很新的。@Robin在没有对其进行基准测试的情况下,无法对性能进行真正的评价,但5000听上去并不是很多。如果这不是导致性能问题的主要原因,我也不会担心。