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