我有这段代码:
List<string> dirParts = new List<string>();
int index = 0;
for (int i = 0; i < dirName.Length; i++)
{
index = dirName.IndexOf("/");
string dironly = dirName.Substring(index, dirName.Length - index);
dirParts.Add(dironly);
}
dirName
例如包含d/1/2/3/4/5
所以我需要在列表dirParts
中最终得到索引0 d
,索引1 d/1
,索引2 d/1/2
,索引3 d/1/2/3
,索引4 d/1/2/3/4
,索引5 d/1/2/3/4/5
因此,当我查看列表时,它应该如下所示:
d
d/1
d/1/2
d/1/2/3
d/1/2/3/4
d/1/2/3/4/5
答案 0 :(得分:3)
可能的实施:
List<string> dirParts = new List<string>();
int index = -1;
while (true) {
index = dirName.IndexOf("/", index + 1);
if (index < 0) {
dirParts.Add(dirName);
break;
}
else
dirParts.Add(dirName.Substring(0, index));
}
答案 1 :(得分:0)
除了这种路径操作最好留给库之外,为了避免你的代码在奇怪的特殊目录名上中断,你的代码就像它一样工作,因为你每次看起来都是相同的“/".
你应该在最后一个之后搜索:
index = dirName.IndexOf("/", index+1);
答案 2 :(得分:0)
如果是目录,我想亲自使用Path
库。唯一的问题是在目录名中使用/
而不是\
,因此您必须在插入之前调用.Replace
:
var orig = "d/1/2/3/4/5"; // Original string
List<String> dirParts = new List<String>(new[]{ orig }); // start out with list of original
// Get the directory below this one. (drop off last folder)
String part = Path.GetDirectoryName(orig);
while (!String.IsNullOrEmpty(part))
{
// add it to the first entry in the list
dirParts.Insert(0, part.Replace('\\','/'));
// get the next parent folder.
part = Path.GetDirectoryName(part);
}
/* dirParts = [ "d", "d/1", "d/1/2", ... ] */
但是,如果你只是在寻找简单而又脏的LINQ方法:
var orig = "d/1/2/3/4/5";
String[] parts = orig.Split('/');
var dirParts = Enumerable.Range(1, parts.Length)
.Select (e => String.Join("/", parts.Take(e)));
答案 3 :(得分:0)
如果你真的想这样做:
for (int i = 0; i < dirName.Length; i++) {
index = dirName.IndexOf("/", index);
if (index == -1)
i = index = dirName.Length; //last one
dirParts.Add(dirName.Substring(0, index++));
}