搜索字符串列表并查找需要更新的文件版本
Searching through a list of strings and looking for file versions that need to be updated
我有两个字符串数组,一个是本地计算机拥有的所有日历版本,另一个是 ftp 服务器拥有的所有版本。我知道如何填充两个数组,我只是不知道如何比较它们以查找过时的版本。
我需要查看本地计算机数组(字符串类似于:date1-date2-version 例如 2021-2022-3),以及 return 需要更新的文件字符串数组。
此代码还需要解决的一些情况:
- 如果日历在 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 字符串的年份。
让我们将 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 版本,即使它不是最新的。如果你不想添加
,你可能需要调整逻辑
我有两个字符串数组,一个是本地计算机拥有的所有日历版本,另一个是 ftp 服务器拥有的所有版本。我知道如何填充两个数组,我只是不知道如何比较它们以查找过时的版本。
我需要查看本地计算机数组(字符串类似于:date1-date2-version 例如 2021-2022-3),以及 return 需要更新的文件字符串数组。
此代码还需要解决的一些情况:
- 如果日历在 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 字符串的年份。
让我们将 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 版本,即使它不是最新的。如果你不想添加
,你可能需要调整逻辑