搜索字符串列表并查找需要更新的文件版本

Posted

技术标签:

【中文标题】搜索字符串列表并查找需要更新的文件版本【英文标题】:Searching through a list of strings and looking for file versions that need to be updated 【发布时间】:2021-12-21 16:52:15 【问题描述】:

我有两个字符串数组,一个是本地计算机拥有的所有日历版本,另一个是 ftp 服务器拥有的所有版本。我知道如何填充两个数组,只是不知道如何比较它们以查找过时的版本。

我需要查看本地计算机数组(字符串类似于:date1-date2-version,例如 2021-2022-3),并返回需要更新的文件字符串数组。

这段代码也需要解决的几种情况:

    如果日历在 ftp 服务器中,并且不在本地计算机上,但低于存储在名为 mostRecentCalender 的字符串中的最高日历日期(不是版本),则不需要添加该日历到数组。 如果本地计算机日历版本落后多个版本,代码只需添加最高版本即可。

ftp 文件夹数组示例:

    2019-2020-1 2019-2020-2 2020-2021-1 2020-2021-2 2020-2021-3 2020-2021-4 2021-2022-1

本地文件夹数组示例:

    2020-2021-1 2020-2021-2

需要更新的版本结果示例(加说明):

    2020-2021-4(这个被添加到数组是因为他们有日历年 2020,但是版本已经过时了,所以它添加了当年的最新版本,忽略了版本 2020-2021-3,因为这是不必要的。 2021-2022-1(添加到数组中是因为它等于名为 mostRecentCalendar 的字符串的年份和版本。版本 2019-2020-1 和 2019-2020-2 被忽略,因为它们没有2019 年的任何日历,并且它们低于 mostRecentCalendar 字符串的年份。

【问题讨论】:

您必须在数组上针对三个不同的问题编写三个不同的查询。因为您的问题中没有包含任何代码,所以很难为您提供帮助。数组中的那些字符串是一次编码文件版本的文件名? 文件名其实是文件夹名,其余文件都在里面。是的。 请在问题中添加更多信息;您知道问题所在,所以这可能是有道理的,但是对您的上下文一无所知的第三方将很难理解您的需求。放置两个填充数组的示例。举例说明算法做出的决策及其结果 @CaiusJard 我已按照您的要求编辑了帖子。 以及“mostRecentCalendar”中的内容 - 你多次提到这一点,但我看不到任何地方提到它可能是什么样的,作为一个字符串 【参考方案1】:

让我们将 ftp 文件夹减少到只有最高版本:

var maxFtps = ftpArray
  .GroupBy(x => x[..9], x => int.Parse(x[10..]))
  .Select(g => (Year: g.Key, Ver: g.Max()))

这会从每个字符串中提取前 9 个字符(因此是年份部分),并且还会从 char 10 开始提取并解析为 int 条目按年份分组,因此您的示例将减少到 3 个条目,每个分组将是一个整数序列,它是版本

接下来我们只选择键和最大版本 int 来生成一些临时 ValieTuple 对象,例如:

"2019-2020", 2
"2020-2021", 4
"2021-2022", 1

现在,我们不需要对当地人那么专业。本质上,我们只需要查找本地是否存在 Year 前缀即可知道如何处理 ftp 版本

var localYears = localsArray.Select(x => x[..9]).ToHashSet();

我们创建一个哈希集来存储输出,因为它会自动重复数据删除

var localHash = localsArray.ToHashSet();

然后我们可以对每个最大 ftps 做出决定——如果它是本地已知的,或者它是最新的,则添加它

foreach(var m in maxFtps)

    var recomposed = m.Year + "-" + m.Ver;
    
  //add it if its a known local year - hashset will auto dedupe
  if(localYears.Contains(m.Year))
    localHash.Add(recomposed);

  //or if this ftp entry represent the most recent
  if(recomposed == mostRecentCalender)
    localHash.Add(mostRecentCalender);
    

我意识到您没有指定如果最近的日历为“2021-2022-4”、本地为“2021-2022-1”和 ftp 为“2021-2022-2”会发生什么”。现有的代码将添加 ftp 版本,即使它不是最新的。如果您不想添加,则可能需要调整逻辑

【讨论】:

在我的脚本中输入此内容时出现一些错误:在第一段中显示“..9”和“10..”的位置,在第一段中显示“..9”的位置第二部分,它无法识别您正在使用的“..”语法。我得到的第二个错误是在调用 foreach 循环时,它说它不能在 maxFtps 上运行,因为它不支持变量类型 ? 当您修复第一个时,第二个可能会消失。这是 c# 版本 9“索引和范围”语法。您可以将x[..9] 替换为x.Remove(9),将x[10..] 替换为x.Substring(10),以获得适用于旧版c#s 的表单

以上是关于搜索字符串列表并查找需要更新的文件版本的主要内容,如果未能解决你的问题,请参考以下文章

在巨大列表中查找/搜索的最有效方法(python)

查找文件中所有出现的字符串并在 Perl 中打印其行号

在swt中按下按钮时如何在列表中搜索字符串

Linux文件查找介绍

python 在列表中查找包含所以某个字符串的项,并保存到一个新的列表

搜索元组列表以查找匹配子字符串的算法方法?