C# 递增文件夹名称,如C中的5.0.0.x#
我有一个文件夹~/ConfigurationDirectory。此文件夹中的子文件夹命名如下 5.0.0.1C# 递增文件夹名称,如C中的5.0.0.x#,c#,C#,我有一个文件夹~/ConfigurationDirectory。此文件夹中的子文件夹命名如下 5.0.0.1 5.0.0.2 5.0.0.3 ... 现在,要求是-以数字标识具有“最大”名称的文件夹,并创建该文件夹的副本。将新文件夹重命名为5.0.0.n+1(假设可用数字最大的文件夹为5.0.0.n) 我已经编写了识别最大命名文件夹的代码。此外,我已经写了代码,将做的文件夹和子文件夹的副本。我无法获取的是,如何获取新文件夹的名称,即5.0.0.n+1 我如何在C#中实现这一点?任何指针都足够
5.0.0.2
5.0.0.3
... 现在,要求是-以数字标识具有“最大”名称的文件夹,并创建该文件夹的副本。将新文件夹重命名为5.0.0.n+1(假设可用数字最大的文件夹为5.0.0.n) 我已经编写了识别最大命名文件夹的代码。此外,我已经写了代码,将做的文件夹和子文件夹的副本。我无法获取的是,如何获取新文件夹的名称,即5.0.0.n+1 我如何在C#中实现这一点?任何指针都足够了,而不是完成编码
谢谢 假设您使用的数字不是简单的由四部分组成的版本号,您需要使用字符串.Split()来分解文件夹名称,然后转换.ToInt32()或int.Parse()将最后一个块转换为数字。从这里开始,您增加它,然后使用类似string.Format()的内容将其转换回文件夹名称
但是,如果您确实使用的是简单的版本号,那么使用
系统.version
类(具体来说,是Parse()
或TryParse()
和ToString()
方法)将是一个非常简单的实现,可应用于任意数量的元素:
a
i
i++
a[last]=i.ToString()
a
的元素确保您的标识算法确实选择了数值最大的值:如果您有5.0.0.9和5.0.0.10,那么如果标识确实使用字母顺序,您将找到5.0.0.9。您可以使用
string.LastIndexOf
来实现此目的(这比使用string.Split要轻得多):
更新:有人指出,鉴于存在以下问题,这种方法可能是过度的。对此,有几点回应:
Version.TryParse
从.NET 4.0开始提供。许多开发人员没有使用.NET 4.0;因此,立即放弃任何替代方法(在我看来)是非常狭隘的
还没有指出性能是否是一个很大的问题。大概不是。但是,当你从概念上考虑这个问题时,Version.TryParse
实际上做了比我们在本例中需要做的多得多的工作:它正在查看版本字符串的每个单独组件,并将它们解析为一个complete对象。另一方面,上面概述的方法只需检查版本字符串的最后一部分,因此效率更高。我有:使用上述方法执行的时间约为使用version.TryParse
所需时间的30%
当然,可以公平地指出,如果一个人已经知道Version.TryParse
并选择编写上述代码,那么他就会犯过早优化的错误。也就是说,假设你不知道,而你已经编写了上述代码。正确的做法是重构代码以使用Version.TryPar吗se
,保持相同的功能并将性能降低约200%?我不是在口头上问;也许在某些情况下,为了简单性和可维护性,可能是这样。但这将是一个判断
我发表这些观点主要是为了反驳那些仅仅因为解决方案执行与“开箱即用”相同的任务而立即拒绝解决方案的人解决方案。有时,根据你的情况,你自己做一些事情是有意义的。只要知道你自己在做什么,并准备好退后一步,在合适的时候改变方向。使用系统;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{
static class Extensions
{
public static TOutput[] ToArray<TSource, TOutput>(this IEnumerable<TSource> col, Converter<TSource, TOutput> converter)
{
return Array.ConvertAll<TSource, TOutput>(col.ToArray(), converter);
}
}
class Program
{
static void Main(string[] args)
{
string original = "5.0.0.0";
int[] tmp = original.Split('.').ToArray<string, int>(new Converter<string, int>(delegate(string s)
{
int result;
return int.TryParse(s, out result) ? result : 0;
}));
tmp[tmp.Length - 1]++;
// re should contain 5.0.0.1
string re = String.Join(".", tmp);
}
}
}
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统集合;
命名空间控制台应用程序1
{
静态类扩展
{
公共静态TOutput[]ToArray(此IEnumerable列,转换器)
{
返回Array.ConvertAll(col.ToArray(),converter);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
字符串original=“5.0.0.0”;
int[]tmp=original.Split('.').ToArray(新转换器(委托)(字符串s)
{
int结果;
返回int.TryParse(s,out结果)?结果:0;
}));
tmp[tmp.Length-1]+;
//re应包含5.0.0.1
string re=string.Join(“.”,tmp);
}
}
}
这是最正确的解决方案,国际海事组织:
Version version;
if (Version.TryParse("5.0.0.0", out version))
{
// your logic here
return new Version(
version.Major,
version.Minor,
version.Build,
version.Revision + 1).ToString();
// will return 5.0.0.1
}
else
{
// error handling here
}
迈克尔·马德森:没错,我的识别算法选择了5.0.0.9而不是5.0.0.10。我将不得不重新审视它。我没有15分来支持你的答案,但是,在我获得15票的那一天,我保证我会支持你的答案。谢谢!既然你可以使用System.Version.TryParse()
?;-)@STW:对于这种特殊情况,您可以使用System.Version,但如果您有5个元素,则无法使用。如果少于4,则需要访问版本结构的其他字段。“手动”操作更灵活,也更易于重用。我们还发现,System.Version.TryParse()
是.NET 4的新版本,OP从未明确提到这些是版本号。如果你编辑你的帖子,我可以删除我的博客。谢谢你的完整代码。我写了一些类似的东西。既然可以使用System.Version.TryParse()
?;-),为什么还要这么做@STW:嗯。。。因为我做到了
Version version;
if (Version.TryParse("5.0.0.0", out version))
{
// your logic here
return new Version(
version.Major,
version.Minor,
version.Build,
version.Revision + 1).ToString();
// will return 5.0.0.1
}
else
{
// error handling here
}