我有一个文件夹〜/ 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#中执行此操作?任何指针都足够而不是完整的编码。
谢谢!
答案 0 :(得分:4)
假设您使用的数字不是简单的四部分版本号,您将要使用string.Split()来分解文件夹名称,然后使用Convert.ToInt32()或int .Parse()将最后一个块转换为数字。从那里,你递增它,然后使用像string.Format()这样的东西把它变回文件夹名。
但是,如果您确实使用的是简单版本号,那么使用System.Version
类(特别是Parse()
或TryParse()
和ToString()
方法)将是一个明显更直接的实现。
答案 1 :(得分:3)
您可以将string.LastIndexOf
用于此目的(这比使用string.Split
轻得多):
static string GetNextFolderName(string folderName)
{
int lastDotPosition = folderName.LastIndexOf('.');
string lastPartOfFolderName = folderName.Substring(lastDotPosition + 1);
int number;
if (int.TryParse(lastPartOfFolderName, out number))
{
number++;
return folderName.Substring(0, lastDotPosition + 1) + number.ToString();
}
else
{
// You've got a problem on your hands, here.
throw new FormatException();
}
}
更新:有人指出,鉴于Version.TryParse
的存在,这种方法可能过分。回答这几点:
Version.TryParse
自.NET 4.0起可用。许多开发人员不使用.NET 4.0;因此,放弃任何替代方法(在我看来)是非常狭隘的。Version.TryParse
实际上比我们在这种情况下需要的工作要多得多:它查看版本字符串的每个单独组件并将它们全部解析为完整的{{3}对象。另一方面,上面概述的方法只是难以检查版本字符串的最后部分,因此更有效。我有Version
:使用上述方法在使用Version.TryParse
的大约30%的时间内执行。Version.TryParse
并且选择编写上面的代码,那么就会因为过早的优化而感到内疚。也就是说,假设你不知道它,并且已经写了上面的代码。正确的做法是重构代码以使用Version.TryParse
,保持相同的功能并将性能降低约200%?我不是在反问;也许在某些情况下,为了简单和可维护性,它可能是。但这将是一次判断。我发布这些要点主要是对任何立即解雇解决方案的人的反驳,因为它执行与“开箱即用”解决方案相同的任务。有时,根据您的具体情况,无论如何都可以自己做一些事情。只要知道自己正在做什么,并准备退后一步,在适当的时候改变方向。
答案 2 :(得分:3)
这是最正确的解决方案,imo:
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
}
答案 3 :(得分:0)
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);
}
}
}
答案 4 :(得分:-1)
这是一个简单的算法,可以应用于任意数量的元素:
a
。i
。i++
a[last] = i.ToString()
a
的元素。确保您的识别算法确实选择了数值最大的值:如果您有5.0.0.9和5.0.0.10,那么如果识别确实使用了字母顺序,您会找到5.0.0.9。