我希望有一些列表,我可以通过名称访问,也可以通过它来访问。
我有一堆我想要创建的子目录,如下所示:
List<string> names = new List<string>();
foreach (var name in names)
{
Directory.CreateDirectory(name);
}
但是,我也希望轻松访问各个名称,如下所示:
Directory.CreateDirectory(Path.Combine(names.subdir1, "Something"));
我想到了ValueTuples:你可以在元组中命名字段,但我认为你不能以任何方式通过元组进行迭代。
或者字典是最好的方式吗?
Dictionary<string, string> names = new Dictionary<string, string>();
foreach (var name in names)
{
Directory.CreateDirectory(name.Value);
}
if (names.TryGetValue("subdir1", out string value))
{
Directory.CreateDirectory(Path.Combine(value, "Something"));
}
有更好的方法吗?谢谢!
更新
如果我使用新课程怎么样:
public class SubDirNames
{
public SubDirNames()
{
}
public const string subdir1 = "Something";
public const string subdir2 = "Something Else";
}
SubDirNames names = new SubDirNames();
string temp = names.subdir1;
有没有办法在课堂上浏览这些字段?还可以通过名称subdir1和subdir2?
访问它们更新2:
好的,我会再试一次澄清我喜欢做什么:我必须创建大约20个子文件夹。我只想在程序中定义这些子文件夹的名称。所以这是一个很好的方法:
List<string> namesOfSubFolders = new List<string>
{
"Datasets",
"Docs",
"Manual",
"Visu1",
"Visu2"
};
string projectPath = @"C:\Project";
string workingDir = Directory.GetCurrentDirectory();
foreach (var subFolder in namesOfSubFolders)
{
Directory.CreateDirectory(Path.Combine(projectPath, subFolder));
}
现在对于其中一些子文件夹,我必须做一些额外的操作。例如:我需要复制子文件夹“Docs”中的一些文件。我可以想到两种方法来做到这一点,两者都不是很好:
File.Copy(Path.Combine(workingDir, "file.txt"), Path.Combine(projectPath, "Docs"));
File.Copy(Path.Combine(workingDir, "file.txt"), Path.Combine(projectPath, namesOfSubFolders[1]));
在第一行中,我重复了子文件夹的名称,在第二行中,我不知道我要复制的子文件夹。还有其他方法吗?
答案 0 :(得分:0)
如果您坚持names.subdir1
语法,可以尝试使用ExpandoObject(实现IDictionary<string, object>
接口):
using System.Dynamic;
...
dynamic names = new ExpandoObject();
names.subdir1 = @"C:\MyDir\MySubDir1";
names.subdir2 = @"C:\MyDir\MySubDir2";
Directory.CreateDirectory(Path.Combine(names.subdir1, "Something"));
// Do we have "subdir3" key?
if ((names as IDictionary<string, object>).ContainsKey("subdir3")) {
...
}
如果names["subdir1"]
语法正常,您可以尝试使用Dictionary<string, string>
:
Dictionary<string, string> names = new Dictionary<string, string>() {
{"subdir1", @"C:\MyDir\MySubDir1"},
{"subdir2", @"C:\MyDir\MySubDir2"},
};
Directory.CreateDirectory(Path.Combine(names["subdir1"], "Something"));