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

Searching through a list of strings and looking for file versions that need to be updated

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

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

此代码还需要解决的一些情况:

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

ftp 个文件夹数组示例:

  1. 2019-2020-1
  2. 2019-2020-2
  3. 2020-2021-1
  4. 2020-2021-2
  5. 2020-2021-3
  6. 2020-2021-4
  7. 2021-2022-1

本地文件夹数组示例:

  1. 2020-2021-1
  2. 2020-2021-2

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

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

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

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

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

接下来我们 select 仅使用密钥和最大版本 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”的 mostRecentCalender、“2021-2022-1”的本地日历和 ftp “2021-2022-2”。目前的代码将添加 ftp 版本,即使它不是最新的。如果你不想添加

,你可能需要调整逻辑