排序/成组列表中的项目
我有一个文件名列表,这将是这个样子:排序/成组列表中的项目
SAN003A-S6cp-201607221655.SSHOW_SYS.tgz
SAN003A-S7cp-201607221655.SSHOW_SYS.tgz
BrocadeRK4-S4cp-201604140110.SSHOW_SYS.tgz
BrocadeRK4-S5cp-201604140110.SSHOW_SYS.tgz
的共同点将成为“SNCP”的格局,其中N是一个数字。之前和之后的情况可能有所不同。它是来自网络交换机的机器生成输出。我可以在列表中有1,2个或更多。我可以处理1或2,或者它们来自同一个开关。来自同一台交换机的文件将匹配'SNcp'之前和之后的文件。如果超过2个,则意味着来自多个交换机的日志会混合在同一个文件夹中。上面的例子中有2个开关。我需要能够根据“SNCP”模式之前的内容进行排序/和/或分组。我想我需要一个正则表达式来完成它,但是当我通过正则表达式搜索分组列表时,我得到了如何执行命名组。所以我不确定GroupBy的谓词应该是什么。 'SNCP'模式的开始位置也会有所不同,所以我不确定我会如何做一个子串。
因此,为了可靠地做到这一点,您需要操纵事实,即您确实知道存在各种事情的模式和原因。我假设这里的排序是A-Z递减。有一些通用的算法:
Create a Dictionary<String, List<File>>.
FOREACH File
collect the first substring (0 to the first -)
try to add the file to the dictionary using the substring as a key
if it works, go to the next one
Catch if the Key doesn't exist
add the substring to the dictionary as a key with a new list
add the file to the dictionary using the new key.
end FOREACH
FOREACH key in the dictionary
sort the list alphabetically
end FOREACH
所以,字典是在通过一个共性,你做了明显的分组东西真的很好或者是切换键(SNC)或名称中它的左边(SAN3000A和类似)。我们可以这样做,因为所有潜在文件都有一个共同的分隔符( - ),所以我可以可靠地“猜测”我的密钥来自哪里。
这是一个有趣的想法。他的价值可能是列表中每个交换机的2个文件的列表.... –
没错。虽然,说实话,我有一个原因,我用一般算法回答。您可以在收集步骤中更改条件,并使用任何您想将其分组的条件。此解决方案还可让您通过使用Dictionary
所以,如果我理解正确的话,你想要做什么,它可能对你有用:
var files = new[]
{
"SAN003A-S6cp-201607221655.SSHOW_SYS.tgz",
"SAN003A-S7cp-201607221655.SSHOW_SYS.tgz",
"BrocadeRK4-S4cp-201604140110.SSHOW_SYS.tgz",
"BrocadeRK4-S5cp-201604140110.SSHOW_SYS.tgz"
};
var regex = new Regex("-(S[0-9]+cp)-", RegexOptions.Compiled);
var grouped = files.GroupBy(x => regex.Match(x).Groups[1].Value);
if (grouped.Any(x => x.Count() > 2))
{
// logs from multiple switches are mixed in the same folder
}
多少组,你想获得以上物品?我的意思是,'N'在所有四个不同,所以你在上面的例子中寻找四个组? – dasblinkenlight
而不是正则表达式,你可能想用'string.IndexOf'获得第一个短划线的索引,然后用它来获得想要分组的所需子串。 – juharr
@dasblinkenlight - 对于上述,我想要两个组,一个以'SAN003A'开头的文件名,一个以'BrocadeRK4'开头的文件名' –