【问题标题】:LINQ: Compare names (string) of two lists and return List<object> instead of list<string>LINQ:比较两个列表的名称(字符串)并返回 List<object> 而不是 list<string>
【发布时间】:2020-10-01 13:29:59
【问题描述】:

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

到目前为止,我有:

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

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

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

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

提前致谢!

【问题讨论】:

    标签: c# .net linq except


    【解决方案1】:

    试试这样的:

    var repoFileNames = xmlFilesRepository
       .Select(x => x.Path.Replace(gitFilePath, string.Empty))
       .ToHashSet();
    
    return xmlFilesProduction.Where(i => !repoFileNames.Contains(i.Name)).ToArray();
    

    这将使用ToHashSet() extension method 将“存储库”中的所有文件名放入HashSet&lt;string&gt;HashSet&lt;T&gt; 非常适合在恒定时间内检查集合成员资格。那么只需使用.Where() 而不是.Except() 来过滤掉NamerepoFileNames 集中找到的“生产文件”。

    【讨论】:

    • 或者甚至 .ToHashSet() 去完全 LINQ。
    • @JohnathanBarclay 更好!已更新。
    • 太棒了,这很顺利!那么,就性能而言,这也是一个不错的选择吗?例如,xmlFilesRepository 包含大约 5000 个文件。我最近听说了 O(n*m) 的概念,但这对我来说还是很新的。
    • @Robin 在没有基准测试的情况下无法真正评论性能,但 5000 听起来并不多。如果这不会导致性能问题,我不会担心。
    猜你喜欢
    • 1970-01-01
    • 2019-04-06
    • 2022-07-11
    • 2014-07-27
    • 2018-12-04
    • 2020-01-26
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多