我想修改看起来像
的源字符串"one.two.three"
并将其转换为带有斜线的字符串,以将其用作具有以下结构的文件夹字符串:
"one\one.two\one.two.three"
除了下面的解决方案之外,您知道实现此目的的更优雅的方法吗?我对for循环不太满意。
var folder = "one.two.three";
var folderParts = folder.Split('.');
var newFolder = new StringBuilder();
for (int i = 0; i < folderParts.Length; i++)
{
for (int j = 0; j < i; j++)
{
if (j == 0)
{
newFolder.Append("\\");
}
newFolder.Append($"{folderParts[j]}.");
}
newFolder.Append(folderParts[i]);
}
答案 0 :(得分:9)
您可以使用Regex非常简洁
var newFolder = Regex.Replace(folder, @"\.", @"\$`.");
这在每个期间都匹配。每次找到句点时,都会插入一个反斜杠,然后在匹配项之前插入整个输入字符串($`
)。我们必须在末尾再次添加句点。
因此,步骤为(<和>表示在该步骤由替换插入的文本):
one<\one>.two.three
one\one.two<\one.two>.three
one\one.two\one.two.three
要获得奖励积分,请使用Path.DirectorySeparatorChar
来确保跨平台的正确性。
var newFolder = Regex.Replace(folder, @"\.", $"{Path.DirectorySeparatorChar}$`.")
这是另一种错误的方式:
var a = "";
var newFolder = Path.Combine(folder.Split('.')
.Select(x => a += (a == "" ? "" : ".") + x).ToArray());
答案 1 :(得分:8)
您可以尝试 Linq :
string folder = "one.two.three";
string[] parts = folder.Split('.');
string result = Path.Combine(Enumerable
.Range(1, parts.Length)
.Select(i => string.Join(".", parts.Take(i)))
.ToArray());
Console.Write(newFolder);
结果:
one\one.two\one.two.three
答案 2 :(得分:3)
您只能像这样在一个循环中前进:
var folder = "one.two.three";
var newFolder = new StringBuilder();
int index = -1;
while (index + 1 < folder.Length) {
index = folder.IndexOf('.', index + 1);
if (index < 0) {
newFolder.Append(folder);
break;
}
else {
newFolder.Append(folder, 0, index);
newFolder.Append(Path.DirectorySeparatorChar);
}
}
您可以try it out here。
答案 3 :(得分:3)
与首先拆分字符串相比,我发现从您拥有的内容开始并减少它更优雅:
var folder = "one.two.three";
var newFolder = string.Empty;
for (var f = folder; f.Any(); f = f.Remove(Math.Max(f.LastIndexOf('.'), 0)))
newFolder = Path.Combine(f, newFolder);
Console.WriteLine(newFolder);
输出:
one\one.two\one.two.three